[
  {
    "path": ". jshintrc",
    "content": "{\n    \"esversion\": 6,\n}"
  },
  {
    "path": ".gitattributes",
    "content": "examples/* linguist-vendored"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "### Description\r\n\r\n### Link to isolated reproduction with no external CSS / JS\r\n[Ideally in jsfiddle.net (https://jsfiddle.net/alvarotrigo/ea17skjr) or codepen.io (https://codepen.io/alvarotrigo/pen/qqabrp), links to personal websites won't be reviewed unless isolated. Reported issues without a reproduction might get closed.]\r\n\r\n### Steps to reproduce it\r\n1. [First step]\r\n2. [Second step]\r\n3. [and so on...]\r\n\r\n### Versions \r\n[Browser, operating system, device, ...]\r\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "1. Make sure to commit it to the `dev` branch!\r\n2. Read https://github.com/alvarotrigo/fullPage.js/wiki/Contributing-to-fullpage.js\r\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n.idea\n.ignore/\n.vscode/*\n.history/\nbower_components/\nnode_modules/\n**/node_modules/\npackage-lock.json\nsrc/fullpage.extensions.js\nsrc/js-extensions/**\nsrc/js-limited/**\nsrc/css-limited/**\nsrc/js/mixed/index.js\ndist/fullpage.extensions.js\ndist/fullpage.limited.js\ndist/fullpage.limited.min.js\ndist/fullpage.limited.min.css\nexamples/bug**\ngulp/secret.js\nbuild/**\nlocal/**\nrollup.ext.config.js\nrollup.limited.config.js"
  },
  {
    "path": "BACKERS.md",
    "content": "# Sponsors & Backers\n\nfullPage.js is being developed and maintained by [Alvaro Trigo](https://twitter.com/imac2).\nAny help you can provide for its development and maintenance over time will be appreciated!\n\nHere's the list of the persons/companies which are currently contributing to fullPage.js.\nThanks for it!\n\nWant to be in the list? [Contact me](https://alvarotrigo.com/#contact) | [Become a patreon](https://www.patreon.com/fullpagejs)\n\n## Bronze Sponsor ($30+ / month)\n\n### Companies\n<!-- bronce start-->\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\" valign=\"middle\">\n        <a href=\"https://codeless.co\" target=\"_blank\">\n          <img src=\"http://wallpapers-for-ipad.com/fullpage/imgs3/logos/codeless.png\" alt=\"Codeless\" title=\"Codeless\" aria-label=\"Codeless\">\n        </a>\n      </td>\n      <td align=\"center\" valign=\"middle\">\n        <a href=\"https://www.stackpath.com/\" target=\"_blank\" rel=\"nofollow\">\n          <img src=\"http://wallpapers-for-ipad.com/fullpage/imgs3/logos/stackpath3.png\">\n        </a>\n      </td>\n      <td align=\"center\" valign=\"middle\">\n        <a href=\"http://www.browserstack.com/\" target=\"_blank\" rel=\"nofollow\">\n          <img src=\"http://wallpapers-for-ipad.com/fullpage/imgs3/logos/browserstack3.png\">\n        </a>\n      </td>\n      <td align=\"center\" valign=\"middle\">\n        <a href=\"https://codepen.com\" target=\"_blank\" rel=\"nofollow\">\n          <img src=\"http://wallpapers-for-ipad.com/fullpage/imgs3/logos/codepen3.png\">\n        </a>\n      </td>\n    </tr>\n  </tbody>\n</table>\n<!-- bronce end-->"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "## Contributing to fullpage.js\n\nYour contributions to the project are very welcome. If you would like to fix a bug or propose a new feature, you can submit a Pull Request.\n\nPlease make sure you follow these points:\n\n- Use the `dev` branch to commit your pull requests. \n- Do not edit files in `dist/` directory\n- If the pull request is related with an issue, please name the issue number in the comments (eg: #16)\n- Please prefer clarity over brevity in all cases (variable names, conditions, functions...)\n- Describe the problem in the Pull Request description (of course you would do it, why do I mention that?)\n\nThank you for your commitment!"
  },
  {
    "path": "FUNDING.yml",
    "content": "github: alvarotrigo"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\r\n                       Version 3, 29 June 2007\r\n\r\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\r\n Everyone is permitted to copy and distribute verbatim copies\r\n of this license document, but changing it is not allowed.\r\n\r\n                            Preamble\r\n\r\n  The GNU General Public License is a free, copyleft license for\r\nsoftware and other kinds of works.\r\n\r\n  The licenses for most software and other practical works are designed\r\nto take away your freedom to share and change the works.  By contrast,\r\nthe GNU General Public License is intended to guarantee your freedom to\r\nshare and change all versions of a program--to make sure it remains free\r\nsoftware for all its users.  We, the Free Software Foundation, use the\r\nGNU General Public License for most of our software; it applies also to\r\nany other work released this way by its authors.  You can apply it to\r\nyour programs, too.\r\n\r\n  When we speak of free software, we are referring to freedom, not\r\nprice.  Our General Public Licenses are designed to make sure that you\r\nhave the freedom to distribute copies of free software (and charge for\r\nthem if you wish), that you receive source code or can get it if you\r\nwant it, that you can change the software or use pieces of it in new\r\nfree programs, and that you know you can do these things.\r\n\r\n  To protect your rights, we need to prevent others from denying you\r\nthese rights or asking you to surrender the rights.  Therefore, you have\r\ncertain responsibilities if you distribute copies of the software, or if\r\nyou modify it: responsibilities to respect the freedom of others.\r\n\r\n  For example, if you distribute copies of such a program, whether\r\ngratis or for a fee, you must pass on to the recipients the same\r\nfreedoms that you received.  You must make sure that they, too, receive\r\nor can get the source code.  And you must show them these terms so they\r\nknow their rights.\r\n\r\n  Developers that use the GNU GPL protect your rights with two steps:\r\n(1) assert copyright on the software, and (2) offer you this License\r\ngiving you legal permission to copy, distribute and/or modify it.\r\n\r\n  For the developers' and authors' protection, the GPL clearly explains\r\nthat there is no warranty for this free software.  For both users' and\r\nauthors' sake, the GPL requires that modified versions be marked as\r\nchanged, so that their problems will not be attributed erroneously to\r\nauthors of previous versions.\r\n\r\n  Some devices are designed to deny users access to install or run\r\nmodified versions of the software inside them, although the manufacturer\r\ncan do so.  This is fundamentally incompatible with the aim of\r\nprotecting users' freedom to change the software.  The systematic\r\npattern of such abuse occurs in the area of products for individuals to\r\nuse, which is precisely where it is most unacceptable.  Therefore, we\r\nhave designed this version of the GPL to prohibit the practice for those\r\nproducts.  If such problems arise substantially in other domains, we\r\nstand ready to extend this provision to those domains in future versions\r\nof the GPL, as needed to protect the freedom of users.\r\n\r\n  Finally, every program is threatened constantly by software patents.\r\nStates should not allow patents to restrict development and use of\r\nsoftware on general-purpose computers, but in those that do, we wish to\r\navoid the special danger that patents applied to a free program could\r\nmake it effectively proprietary.  To prevent this, the GPL assures that\r\npatents cannot be used to render the program non-free.\r\n\r\n  The precise terms and conditions for copying, distribution and\r\nmodification follow.\r\n\r\n                       TERMS AND CONDITIONS\r\n\r\n  0. Definitions.\r\n\r\n  \"This License\" refers to version 3 of the GNU General Public License.\r\n\r\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\r\nworks, such as semiconductor masks.\r\n\r\n  \"The Program\" refers to any copyrightable work licensed under this\r\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\r\n\"recipients\" may be individuals or organizations.\r\n\r\n  To \"modify\" a work means to copy from or adapt all or part of the work\r\nin a fashion requiring copyright permission, other than the making of an\r\nexact copy.  The resulting work is called a \"modified version\" of the\r\nearlier work or a work \"based on\" the earlier work.\r\n\r\n  A \"covered work\" means either the unmodified Program or a work based\r\non the Program.\r\n\r\n  To \"propagate\" a work means to do anything with it that, without\r\npermission, would make you directly or secondarily liable for\r\ninfringement under applicable copyright law, except executing it on a\r\ncomputer or modifying a private copy.  Propagation includes copying,\r\ndistribution (with or without modification), making available to the\r\npublic, and in some countries other activities as well.\r\n\r\n  To \"convey\" a work means any kind of propagation that enables other\r\nparties to make or receive copies.  Mere interaction with a user through\r\na computer network, with no transfer of a copy, is not conveying.\r\n\r\n  An interactive user interface displays \"Appropriate Legal Notices\"\r\nto the extent that it includes a convenient and prominently visible\r\nfeature that (1) displays an appropriate copyright notice, and (2)\r\ntells the user that there is no warranty for the work (except to the\r\nextent that warranties are provided), that licensees may convey the\r\nwork under this License, and how to view a copy of this License.  If\r\nthe interface presents a list of user commands or options, such as a\r\nmenu, a prominent item in the list meets this criterion.\r\n\r\n  1. Source Code.\r\n\r\n  The \"source code\" for a work means the preferred form of the work\r\nfor making modifications to it.  \"Object code\" means any non-source\r\nform of a work.\r\n\r\n  A \"Standard Interface\" means an interface that either is an official\r\nstandard defined by a recognized standards body, or, in the case of\r\ninterfaces specified for a particular programming language, one that\r\nis widely used among developers working in that language.\r\n\r\n  The \"System Libraries\" of an executable work include anything, other\r\nthan the work as a whole, that (a) is included in the normal form of\r\npackaging a Major Component, but which is not part of that Major\r\nComponent, and (b) serves only to enable use of the work with that\r\nMajor Component, or to implement a Standard Interface for which an\r\nimplementation is available to the public in source code form.  A\r\n\"Major Component\", in this context, means a major essential component\r\n(kernel, window system, and so on) of the specific operating system\r\n(if any) on which the executable work runs, or a compiler used to\r\nproduce the work, or an object code interpreter used to run it.\r\n\r\n  The \"Corresponding Source\" for a work in object code form means all\r\nthe source code needed to generate, install, and (for an executable\r\nwork) run the object code and to modify the work, including scripts to\r\ncontrol those activities.  However, it does not include the work's\r\nSystem Libraries, or general-purpose tools or generally available free\r\nprograms which are used unmodified in performing those activities but\r\nwhich are not part of the work.  For example, Corresponding Source\r\nincludes interface definition files associated with source files for\r\nthe work, and the source code for shared libraries and dynamically\r\nlinked subprograms that the work is specifically designed to require,\r\nsuch as by intimate data communication or control flow between those\r\nsubprograms and other parts of the work.\r\n\r\n  The Corresponding Source need not include anything that users\r\ncan regenerate automatically from other parts of the Corresponding\r\nSource.\r\n\r\n  The Corresponding Source for a work in source code form is that\r\nsame work.\r\n\r\n  2. Basic Permissions.\r\n\r\n  All rights granted under this License are granted for the term of\r\ncopyright on the Program, and are irrevocable provided the stated\r\nconditions are met.  This License explicitly affirms your unlimited\r\npermission to run the unmodified Program.  The output from running a\r\ncovered work is covered by this License only if the output, given its\r\ncontent, constitutes a covered work.  This License acknowledges your\r\nrights of fair use or other equivalent, as provided by copyright law.\r\n\r\n  You may make, run and propagate covered works that you do not\r\nconvey, without conditions so long as your license otherwise remains\r\nin force.  You may convey covered works to others for the sole purpose\r\nof having them make modifications exclusively for you, or provide you\r\nwith facilities for running those works, provided that you comply with\r\nthe terms of this License in conveying all material for which you do\r\nnot control copyright.  Those thus making or running the covered works\r\nfor you must do so exclusively on your behalf, under your direction\r\nand control, on terms that prohibit them from making any copies of\r\nyour copyrighted material outside their relationship with you.\r\n\r\n  Conveying under any other circumstances is permitted solely under\r\nthe conditions stated below.  Sublicensing is not allowed; section 10\r\nmakes it unnecessary.\r\n\r\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\r\n\r\n  No covered work shall be deemed part of an effective technological\r\nmeasure under any applicable law fulfilling obligations under article\r\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\r\nsimilar laws prohibiting or restricting circumvention of such\r\nmeasures.\r\n\r\n  When you convey a covered work, you waive any legal power to forbid\r\ncircumvention of technological measures to the extent such circumvention\r\nis effected by exercising rights under this License with respect to\r\nthe covered work, and you disclaim any intention to limit operation or\r\nmodification of the work as a means of enforcing, against the work's\r\nusers, your or third parties' legal rights to forbid circumvention of\r\ntechnological measures.\r\n\r\n  4. Conveying Verbatim Copies.\r\n\r\n  You may convey verbatim copies of the Program's source code as you\r\nreceive it, in any medium, provided that you conspicuously and\r\nappropriately publish on each copy an appropriate copyright notice;\r\nkeep intact all notices stating that this License and any\r\nnon-permissive terms added in accord with section 7 apply to the code;\r\nkeep intact all notices of the absence of any warranty; and give all\r\nrecipients a copy of this License along with the Program.\r\n\r\n  You may charge any price or no price for each copy that you convey,\r\nand you may offer support or warranty protection for a fee.\r\n\r\n  5. Conveying Modified Source Versions.\r\n\r\n  You may convey a work based on the Program, or the modifications to\r\nproduce it from the Program, in the form of source code under the\r\nterms of section 4, provided that you also meet all of these conditions:\r\n\r\n    a) The work must carry prominent notices stating that you modified\r\n    it, and giving a relevant date.\r\n\r\n    b) The work must carry prominent notices stating that it is\r\n    released under this License and any conditions added under section\r\n    7.  This requirement modifies the requirement in section 4 to\r\n    \"keep intact all notices\".\r\n\r\n    c) You must license the entire work, as a whole, under this\r\n    License to anyone who comes into possession of a copy.  This\r\n    License will therefore apply, along with any applicable section 7\r\n    additional terms, to the whole of the work, and all its parts,\r\n    regardless of how they are packaged.  This License gives no\r\n    permission to license the work in any other way, but it does not\r\n    invalidate such permission if you have separately received it.\r\n\r\n    d) If the work has interactive user interfaces, each must display\r\n    Appropriate Legal Notices; however, if the Program has interactive\r\n    interfaces that do not display Appropriate Legal Notices, your\r\n    work need not make them do so.\r\n\r\n  A compilation of a covered work with other separate and independent\r\nworks, which are not by their nature extensions of the covered work,\r\nand which are not combined with it such as to form a larger program,\r\nin or on a volume of a storage or distribution medium, is called an\r\n\"aggregate\" if the compilation and its resulting copyright are not\r\nused to limit the access or legal rights of the compilation's users\r\nbeyond what the individual works permit.  Inclusion of a covered work\r\nin an aggregate does not cause this License to apply to the other\r\nparts of the aggregate.\r\n\r\n  6. Conveying Non-Source Forms.\r\n\r\n  You may convey a covered work in object code form under the terms\r\nof sections 4 and 5, provided that you also convey the\r\nmachine-readable Corresponding Source under the terms of this License,\r\nin one of these ways:\r\n\r\n    a) Convey the object code in, or embodied in, a physical product\r\n    (including a physical distribution medium), accompanied by the\r\n    Corresponding Source fixed on a durable physical medium\r\n    customarily used for software interchange.\r\n\r\n    b) Convey the object code in, or embodied in, a physical product\r\n    (including a physical distribution medium), accompanied by a\r\n    written offer, valid for at least three years and valid for as\r\n    long as you offer spare parts or customer support for that product\r\n    model, to give anyone who possesses the object code either (1) a\r\n    copy of the Corresponding Source for all the software in the\r\n    product that is covered by this License, on a durable physical\r\n    medium customarily used for software interchange, for a price no\r\n    more than your reasonable cost of physically performing this\r\n    conveying of source, or (2) access to copy the\r\n    Corresponding Source from a network server at no charge.\r\n\r\n    c) Convey individual copies of the object code with a copy of the\r\n    written offer to provide the Corresponding Source.  This\r\n    alternative is allowed only occasionally and noncommercially, and\r\n    only if you received the object code with such an offer, in accord\r\n    with subsection 6b.\r\n\r\n    d) Convey the object code by offering access from a designated\r\n    place (gratis or for a charge), and offer equivalent access to the\r\n    Corresponding Source in the same way through the same place at no\r\n    further charge.  You need not require recipients to copy the\r\n    Corresponding Source along with the object code.  If the place to\r\n    copy the object code is a network server, the Corresponding Source\r\n    may be on a different server (operated by you or a third party)\r\n    that supports equivalent copying facilities, provided you maintain\r\n    clear directions next to the object code saying where to find the\r\n    Corresponding Source.  Regardless of what server hosts the\r\n    Corresponding Source, you remain obligated to ensure that it is\r\n    available for as long as needed to satisfy these requirements.\r\n\r\n    e) Convey the object code using peer-to-peer transmission, provided\r\n    you inform other peers where the object code and Corresponding\r\n    Source of the work are being offered to the general public at no\r\n    charge under subsection 6d.\r\n\r\n  A separable portion of the object code, whose source code is excluded\r\nfrom the Corresponding Source as a System Library, need not be\r\nincluded in conveying the object code work.\r\n\r\n  A \"User Product\" is either (1) a \"consumer product\", which means any\r\ntangible personal property which is normally used for personal, family,\r\nor household purposes, or (2) anything designed or sold for incorporation\r\ninto a dwelling.  In determining whether a product is a consumer product,\r\ndoubtful cases shall be resolved in favor of coverage.  For a particular\r\nproduct received by a particular user, \"normally used\" refers to a\r\ntypical or common use of that class of product, regardless of the status\r\nof the particular user or of the way in which the particular user\r\nactually uses, or expects or is expected to use, the product.  A product\r\nis a consumer product regardless of whether the product has substantial\r\ncommercial, industrial or non-consumer uses, unless such uses represent\r\nthe only significant mode of use of the product.\r\n\r\n  \"Installation Information\" for a User Product means any methods,\r\nprocedures, authorization keys, or other information required to install\r\nand execute modified versions of a covered work in that User Product from\r\na modified version of its Corresponding Source.  The information must\r\nsuffice to ensure that the continued functioning of the modified object\r\ncode is in no case prevented or interfered with solely because\r\nmodification has been made.\r\n\r\n  If you convey an object code work under this section in, or with, or\r\nspecifically for use in, a User Product, and the conveying occurs as\r\npart of a transaction in which the right of possession and use of the\r\nUser Product is transferred to the recipient in perpetuity or for a\r\nfixed term (regardless of how the transaction is characterized), the\r\nCorresponding Source conveyed under this section must be accompanied\r\nby the Installation Information.  But this requirement does not apply\r\nif neither you nor any third party retains the ability to install\r\nmodified object code on the User Product (for example, the work has\r\nbeen installed in ROM).\r\n\r\n  The requirement to provide Installation Information does not include a\r\nrequirement to continue to provide support service, warranty, or updates\r\nfor a work that has been modified or installed by the recipient, or for\r\nthe User Product in which it has been modified or installed.  Access to a\r\nnetwork may be denied when the modification itself materially and\r\nadversely affects the operation of the network or violates the rules and\r\nprotocols for communication across the network.\r\n\r\n  Corresponding Source conveyed, and Installation Information provided,\r\nin accord with this section must be in a format that is publicly\r\ndocumented (and with an implementation available to the public in\r\nsource code form), and must require no special password or key for\r\nunpacking, reading or copying.\r\n\r\n  7. Additional Terms.\r\n\r\n  \"Additional permissions\" are terms that supplement the terms of this\r\nLicense by making exceptions from one or more of its conditions.\r\nAdditional permissions that are applicable to the entire Program shall\r\nbe treated as though they were included in this License, to the extent\r\nthat they are valid under applicable law.  If additional permissions\r\napply only to part of the Program, that part may be used separately\r\nunder those permissions, but the entire Program remains governed by\r\nthis License without regard to the additional permissions.\r\n\r\n  When you convey a copy of a covered work, you may at your option\r\nremove any additional permissions from that copy, or from any part of\r\nit.  (Additional permissions may be written to require their own\r\nremoval in certain cases when you modify the work.)  You may place\r\nadditional permissions on material, added by you to a covered work,\r\nfor which you have or can give appropriate copyright permission.\r\n\r\n  Notwithstanding any other provision of this License, for material you\r\nadd to a covered work, you may (if authorized by the copyright holders of\r\nthat material) supplement the terms of this License with terms:\r\n\r\n    a) Disclaiming warranty or limiting liability differently from the\r\n    terms of sections 15 and 16 of this License; or\r\n\r\n    b) Requiring preservation of specified reasonable legal notices or\r\n    author attributions in that material or in the Appropriate Legal\r\n    Notices displayed by works containing it; or\r\n\r\n    c) Prohibiting misrepresentation of the origin of that material, or\r\n    requiring that modified versions of such material be marked in\r\n    reasonable ways as different from the original version; or\r\n\r\n    d) Limiting the use for publicity purposes of names of licensors or\r\n    authors of the material; or\r\n\r\n    e) Declining to grant rights under trademark law for use of some\r\n    trade names, trademarks, or service marks; or\r\n\r\n    f) Requiring indemnification of licensors and authors of that\r\n    material by anyone who conveys the material (or modified versions of\r\n    it) with contractual assumptions of liability to the recipient, for\r\n    any liability that these contractual assumptions directly impose on\r\n    those licensors and authors.\r\n\r\n  All other non-permissive additional terms are considered \"further\r\nrestrictions\" within the meaning of section 10.  If the Program as you\r\nreceived it, or any part of it, contains a notice stating that it is\r\ngoverned by this License along with a term that is a further\r\nrestriction, you may remove that term.  If a license document contains\r\na further restriction but permits relicensing or conveying under this\r\nLicense, you may add to a covered work material governed by the terms\r\nof that license document, provided that the further restriction does\r\nnot survive such relicensing or conveying.\r\n\r\n  If you add terms to a covered work in accord with this section, you\r\nmust place, in the relevant source files, a statement of the\r\nadditional terms that apply to those files, or a notice indicating\r\nwhere to find the applicable terms.\r\n\r\n  Additional terms, permissive or non-permissive, may be stated in the\r\nform of a separately written license, or stated as exceptions;\r\nthe above requirements apply either way.\r\n\r\n  8. Termination.\r\n\r\n  You may not propagate or modify a covered work except as expressly\r\nprovided under this License.  Any attempt otherwise to propagate or\r\nmodify it is void, and will automatically terminate your rights under\r\nthis License (including any patent licenses granted under the third\r\nparagraph of section 11).\r\n\r\n  However, if you cease all violation of this License, then your\r\nlicense from a particular copyright holder is reinstated (a)\r\nprovisionally, unless and until the copyright holder explicitly and\r\nfinally terminates your license, and (b) permanently, if the copyright\r\nholder fails to notify you of the violation by some reasonable means\r\nprior to 60 days after the cessation.\r\n\r\n  Moreover, your license from a particular copyright holder is\r\nreinstated permanently if the copyright holder notifies you of the\r\nviolation by some reasonable means, this is the first time you have\r\nreceived notice of violation of this License (for any work) from that\r\ncopyright holder, and you cure the violation prior to 30 days after\r\nyour receipt of the notice.\r\n\r\n  Termination of your rights under this section does not terminate the\r\nlicenses of parties who have received copies or rights from you under\r\nthis License.  If your rights have been terminated and not permanently\r\nreinstated, you do not qualify to receive new licenses for the same\r\nmaterial under section 10.\r\n\r\n  9. Acceptance Not Required for Having Copies.\r\n\r\n  You are not required to accept this License in order to receive or\r\nrun a copy of the Program.  Ancillary propagation of a covered work\r\noccurring solely as a consequence of using peer-to-peer transmission\r\nto receive a copy likewise does not require acceptance.  However,\r\nnothing other than this License grants you permission to propagate or\r\nmodify any covered work.  These actions infringe copyright if you do\r\nnot accept this License.  Therefore, by modifying or propagating a\r\ncovered work, you indicate your acceptance of this License to do so.\r\n\r\n  10. Automatic Licensing of Downstream Recipients.\r\n\r\n  Each time you convey a covered work, the recipient automatically\r\nreceives a license from the original licensors, to run, modify and\r\npropagate that work, subject to this License.  You are not responsible\r\nfor enforcing compliance by third parties with this License.\r\n\r\n  An \"entity transaction\" is a transaction transferring control of an\r\norganization, or substantially all assets of one, or subdividing an\r\norganization, or merging organizations.  If propagation of a covered\r\nwork results from an entity transaction, each party to that\r\ntransaction who receives a copy of the work also receives whatever\r\nlicenses to the work the party's predecessor in interest had or could\r\ngive under the previous paragraph, plus a right to possession of the\r\nCorresponding Source of the work from the predecessor in interest, if\r\nthe predecessor has it or can get it with reasonable efforts.\r\n\r\n  You may not impose any further restrictions on the exercise of the\r\nrights granted or affirmed under this License.  For example, you may\r\nnot impose a license fee, royalty, or other charge for exercise of\r\nrights granted under this License, and you may not initiate litigation\r\n(including a cross-claim or counterclaim in a lawsuit) alleging that\r\nany patent claim is infringed by making, using, selling, offering for\r\nsale, or importing the Program or any portion of it.\r\n\r\n  11. Patents.\r\n\r\n  A \"contributor\" is a copyright holder who authorizes use under this\r\nLicense of the Program or a work on which the Program is based.  The\r\nwork thus licensed is called the contributor's \"contributor version\".\r\n\r\n  A contributor's \"essential patent claims\" are all patent claims\r\nowned or controlled by the contributor, whether already acquired or\r\nhereafter acquired, that would be infringed by some manner, permitted\r\nby this License, of making, using, or selling its contributor version,\r\nbut do not include claims that would be infringed only as a\r\nconsequence of further modification of the contributor version.  For\r\npurposes of this definition, \"control\" includes the right to grant\r\npatent sublicenses in a manner consistent with the requirements of\r\nthis License.\r\n\r\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\r\npatent license under the contributor's essential patent claims, to\r\nmake, use, sell, offer for sale, import and otherwise run, modify and\r\npropagate the contents of its contributor version.\r\n\r\n  In the following three paragraphs, a \"patent license\" is any express\r\nagreement or commitment, however denominated, not to enforce a patent\r\n(such as an express permission to practice a patent or covenant not to\r\nsue for patent infringement).  To \"grant\" such a patent license to a\r\nparty means to make such an agreement or commitment not to enforce a\r\npatent against the party.\r\n\r\n  If you convey a covered work, knowingly relying on a patent license,\r\nand the Corresponding Source of the work is not available for anyone\r\nto copy, free of charge and under the terms of this License, through a\r\npublicly available network server or other readily accessible means,\r\nthen you must either (1) cause the Corresponding Source to be so\r\navailable, or (2) arrange to deprive yourself of the benefit of the\r\npatent license for this particular work, or (3) arrange, in a manner\r\nconsistent with the requirements of this License, to extend the patent\r\nlicense to downstream recipients.  \"Knowingly relying\" means you have\r\nactual knowledge that, but for the patent license, your conveying the\r\ncovered work in a country, or your recipient's use of the covered work\r\nin a country, would infringe one or more identifiable patents in that\r\ncountry that you have reason to believe are valid.\r\n\r\n  If, pursuant to or in connection with a single transaction or\r\narrangement, you convey, or propagate by procuring conveyance of, a\r\ncovered work, and grant a patent license to some of the parties\r\nreceiving the covered work authorizing them to use, propagate, modify\r\nor convey a specific copy of the covered work, then the patent license\r\nyou grant is automatically extended to all recipients of the covered\r\nwork and works based on it.\r\n\r\n  A patent license is \"discriminatory\" if it does not include within\r\nthe scope of its coverage, prohibits the exercise of, or is\r\nconditioned on the non-exercise of one or more of the rights that are\r\nspecifically granted under this License.  You may not convey a covered\r\nwork if you are a party to an arrangement with a third party that is\r\nin the business of distributing software, under which you make payment\r\nto the third party based on the extent of your activity of conveying\r\nthe work, and under which the third party grants, to any of the\r\nparties who would receive the covered work from you, a discriminatory\r\npatent license (a) in connection with copies of the covered work\r\nconveyed by you (or copies made from those copies), or (b) primarily\r\nfor and in connection with specific products or compilations that\r\ncontain the covered work, unless you entered into that arrangement,\r\nor that patent license was granted, prior to 28 March 2007.\r\n\r\n  Nothing in this License shall be construed as excluding or limiting\r\nany implied license or other defenses to infringement that may\r\notherwise be available to you under applicable patent law.\r\n\r\n  12. No Surrender of Others' Freedom.\r\n\r\n  If conditions are imposed on you (whether by court order, agreement or\r\notherwise) that contradict the conditions of this License, they do not\r\nexcuse you from the conditions of this License.  If you cannot convey a\r\ncovered work so as to satisfy simultaneously your obligations under this\r\nLicense and any other pertinent obligations, then as a consequence you may\r\nnot convey it at all.  For example, if you agree to terms that obligate you\r\nto collect a royalty for further conveying from those to whom you convey\r\nthe Program, the only way you could satisfy both those terms and this\r\nLicense would be to refrain entirely from conveying the Program.\r\n\r\n  13. Use with the GNU Affero General Public License.\r\n\r\n  Notwithstanding any other provision of this License, you have\r\npermission to link or combine any covered work with a work licensed\r\nunder version 3 of the GNU Affero General Public License into a single\r\ncombined work, and to convey the resulting work.  The terms of this\r\nLicense will continue to apply to the part which is the covered work,\r\nbut the special requirements of the GNU Affero General Public License,\r\nsection 13, concerning interaction through a network will apply to the\r\ncombination as such.\r\n\r\n  14. Revised Versions of this License.\r\n\r\n  The Free Software Foundation may publish revised and/or new versions of\r\nthe GNU General Public License from time to time.  Such new versions will\r\nbe similar in spirit to the present version, but may differ in detail to\r\naddress new problems or concerns.\r\n\r\n  Each version is given a distinguishing version number.  If the\r\nProgram specifies that a certain numbered version of the GNU General\r\nPublic License \"or any later version\" applies to it, you have the\r\noption of following the terms and conditions either of that numbered\r\nversion or of any later version published by the Free Software\r\nFoundation.  If the Program does not specify a version number of the\r\nGNU General Public License, you may choose any version ever published\r\nby the Free Software Foundation.\r\n\r\n  If the Program specifies that a proxy can decide which future\r\nversions of the GNU General Public License can be used, that proxy's\r\npublic statement of acceptance of a version permanently authorizes you\r\nto choose that version for the Program.\r\n\r\n  Later license versions may give you additional or different\r\npermissions.  However, no additional obligations are imposed on any\r\nauthor or copyright holder as a result of your choosing to follow a\r\nlater version.\r\n\r\n  15. Disclaimer of Warranty.\r\n\r\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\r\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\r\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\r\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\r\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\r\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\r\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\r\n\r\n  16. Limitation of Liability.\r\n\r\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\r\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\r\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\r\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\r\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\r\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\r\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\r\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\r\nSUCH DAMAGES.\r\n\r\n  17. Interpretation of Sections 15 and 16.\r\n\r\n  If the disclaimer of warranty and limitation of liability provided\r\nabove cannot be given local legal effect according to their terms,\r\nreviewing courts shall apply local law that most closely approximates\r\nan absolute waiver of all civil liability in connection with the\r\nProgram, unless a warranty or assumption of liability accompanies a\r\ncopy of the Program in return for a fee.\r\n\r\n                     END OF TERMS AND CONDITIONS\r\n\r\n            How to Apply These Terms to Your New Programs\r\n\r\n  If you develop a new program, and you want it to be of the greatest\r\npossible use to the public, the best way to achieve this is to make it\r\nfree software which everyone can redistribute and change under these terms.\r\n\r\n  To do so, attach the following notices to the program.  It is safest\r\nto attach them to the start of each source file to most effectively\r\nstate the exclusion of warranty; and each file should have at least\r\nthe \"copyright\" line and a pointer to where the full notice is found.\r\n\r\n    <one line to give the program's name and a brief idea of what it does.>\r\n    Copyright (C) <year>  <name of author>\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU General Public License as published by\r\n    the Free Software Foundation, either version 3 of the License, or\r\n    (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public License\r\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\r\n\r\nAlso add information on how to contact you by electronic and paper mail.\r\n\r\n  If the program does terminal interaction, make it output a short\r\nnotice like this when it starts in an interactive mode:\r\n\r\n    <program>  Copyright (C) <year>  <name of author>\r\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\r\n    This is free software, and you are welcome to redistribute it\r\n    under certain conditions; type `show c' for details.\r\n\r\nThe hypothetical commands `show w' and `show c' should show the appropriate\r\nparts of the General Public License.  Of course, your program's commands\r\nmight be different; for a GUI interface, you would use an \"about box\".\r\n\r\n  You should also get your employer (if you work as a programmer) or school,\r\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\r\nFor more information on this, and how to apply and follow the GNU GPL, see\r\n<https://www.gnu.org/licenses/>.\r\n\r\n  The GNU General Public License does not permit incorporating your program\r\ninto proprietary programs.  If your program is a subroutine library, you\r\nmay consider it more useful to permit linking proprietary applications with\r\nthe library.  If this is what you want to do, use the GNU Lesser General\r\nPublic License instead of this License.  But first, please read\r\n<https://www.gnu.org/licenses/why-not-lgpl.html>."
  },
  {
    "path": "README.md",
    "content": "# fullPage.js\r\n![preview](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/intro.png)\r\n![compatibility](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/compatible.png)\r\n\r\n<p align=\"center\">\r\n  <span>English</span> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish#fullpagejs\">Español</a> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#fullpagejs\">Français</a> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian#fullpagejs\">Pусский</a> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese#fullpagejs\">中文</a> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#fullpagejs\">한국어</a> | \r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese#fullpagejs\"> 日本語</a> | \r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese#fullpagejs\">Português Brasileiro</a>\r\n</p>\r\n\r\n<p align=\"center\">\r\n\tAvailable for <a href=\"https://github.com/alvarotrigo/vue-fullpage.js\">Vue</a>, <a href=\"https://github.com/alvarotrigo/react-fullpage\">React</a> and <a href=\"https://github.com/alvarotrigo/angular-fullpage\">Angular</a>.\r\n</p>\r\n\r\n---\r\n\r\n![fullPage.js version](https://img.shields.io/badge/fullPage.js-v4.0.41-brightgreen.svg)\r\n[![License](https://img.shields.io/badge/License-GPL-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.html)\r\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/fullpage.js/badge?style=rounded)](https://www.jsdelivr.com/package/npm/fullpage.js)\r\n[![Minzipped Size](https://img.shields.io/bundlephobia/minzip/fullpage.js)](https://bundlephobia.com/package/fullpage.js)\r\n&nbsp;&nbsp;**|**&nbsp;&nbsp; *Created by [@imac2](https://twitter.com/imac2)*\r\n\r\n- [Demo online](https://alvarotrigo.com/fullPage/) | [Codepen](https://codepen.io/alvarotrigo/pen/qqabrp)\r\n- [Wordpress plugin for Gutenberg](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/) and [WordPress plugin for Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/)\r\n- [Wordpress theme](https://alvarotrigo.com/fullPage/utils/wordpress.html)\r\n- [fullpage.js Extensions](https://alvarotrigo.com/fullPage/extensions/)\r\n- [Frequently Answered Questions](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions)\r\n- [[Migration from fullPage v3 to fullpage v4]](https://alvarotrigo.com/fullPage/help/migration-from-fullpage-3/)\r\n---\r\n\r\nA simple and easy to use library that creates fullscreen scrolling websites (also known as single page websites or onepage sites) and adds landscape sliders inside the sections of the site.\r\n\r\n- [Introduction](https://github.com/alvarotrigo/fullPage.js#introduction)\r\n- [Compatibility](https://github.com/alvarotrigo/fullPage.js#compatibility)\r\n- [License](https://github.com/alvarotrigo/fullPage.js#license)\r\n- [Usage](https://github.com/alvarotrigo/fullPage.js#usage)\r\n  - [Creating links to sections or slides](https://github.com/alvarotrigo/fullPage.js#creating-links-to-sections-or-slides)\r\n  - [Creating smaller or bigger sections](https://github.com/alvarotrigo/fullPage.js#creating-smaller-or-bigger-sections)\r\n  - [State classes added by fullpage.js](https://github.com/alvarotrigo/fullPage.js#state-classes-added-by-fullpagejs)\r\n  - [Lazy loading](https://github.com/alvarotrigo/fullPage.js#lazy-loading)\r\n  - [Auto play/pause embedded media](https://github.com/alvarotrigo/fullPage.js#auto-playpause-embedded-media)\r\n  - [Use extensions](https://github.com/alvarotrigo/fullPage.js#use-extensions)\r\n- [Options](https://github.com/alvarotrigo/fullPage.js#options)\r\n- [Methods](https://github.com/alvarotrigo/fullPage.js#methods)\r\n- [Callbacks](https://github.com/alvarotrigo/fullPage.js#callbacks)\r\n- [Reporting issues](https://github.com/alvarotrigo/fullPage.js#reporting-issues)\r\n- [Contributing to fullpage.js](https://github.com/alvarotrigo/fullPage.js#contributing-to-fullpagejs)\r\n- [Changelog](https://github.com/alvarotrigo/fullPage.js#changelog)\r\n- [Build tasks](https://github.com/alvarotrigo/fullPage.js#build-tasks)\r\n- [Resources](https://github.com/alvarotrigo/fullPage.js#resources)\r\n- [Who is using fullpage.js](https://github.com/alvarotrigo/fullPage.js#who-is-using-fullpagejs)\r\n- [Donations](https://github.com/alvarotrigo/fullPage.js#donations)\r\n- [Sponsors](https://github.com/alvarotrigo/fullPage.js#sponsors)\r\n\r\n## Introduction\r\nSuggestion are more than welcome, not only for feature requests but also for coding style improvements.\r\nLet's make this a great library to make people's lives easier!\r\n\r\n## Compatibility\r\nfullPage.js is fully functional on all modern browsers and with IE 11. If you need to support IE < 11 consider using [fullPage.js v3](https://github.com/alvarotrigo/fullPage.js/tree/3.1.2).\r\nIt also provides touch support for mobile phones, tablets and touch screen computers.\r\n\r\nSpecial thanks to [Browserstack](https://www.browserstack.com/) for supporting fullpage.js.\r\n\r\n## License\r\n\r\n### Commercial license\r\nIf you want to use fullPage to develop non open sourced sites, themes, projects, and applications, the Commercial license is the appropriate license. With this option, your source code is kept proprietary. Which means, you won't have to change your whole application source code to an open source license. [[Purchase a Fullpage Commercial License]](https://alvarotrigo.com/fullPage/pricing/)\r\n\r\n### Open source license\r\nIf you are creating an open source application under a license compatible with the [GNU GPL license v3](https://www.gnu.org/licenses/gpl-3.0.html), you may use fullPage under the terms of the GPLv3.\r\n\r\n**You will have to provide a prominent notice that fullPage.js is in use. The credit comments in the JavaScript and CSS files should be kept intact** (even after combination or minification).\r\n\r\n[Read more about fullPage's license](https://alvarotrigo.com/fullPage/pricing/).\r\n\r\n## Usage\r\nAs you can see in the example files, you will need to include:\r\n - The JavaScript file `fullpage.js` (or its minified version `fullpage.min.js`)\r\n - The css file `fullpage.css`\r\n\r\n **Optionally**, when using `css3:false`, you can add the [easings file](https://github.com/alvarotrigo/fullPage.js/tree/master/vendors/easings.min.js) in case you want to use other easing effects apart from the one included in the library (`easeInOutCubic`).\r\n\r\n### Install using bower or npm\r\n**Optionally**, you can install fullPage.js with bower or npm if you prefer:\r\n\r\nTerminal:\r\n```shell\r\n// With bower\r\nbower install fullpage.js\r\n\r\n// With npm\r\nnpm install fullpage.js\r\n```\r\n\r\n### Including files\r\n```html\r\n<link rel=\"stylesheet\" type=\"text/css\" href=\"fullpage.css\" />\r\n\r\n<!-- This following line is optional. Only necessary if you use the option css3:false and you want to use other easing effects rather than \"easeInOutCubic\". -->\r\n<script src=\"vendors/easings.min.js\"></script>\r\n\r\n<script type=\"text/javascript\" src=\"fullpage.js\"></script>\r\n```\r\n\r\nUsing Webpack, Browserify or Require.js? Check [how to use fullPage.js with module loaders](https://github.com/alvarotrigo/fullPage.js/wiki/Use-module-loaders-for-fullPage.js).\r\n\r\n### Optional use of CDN\r\nIf you prefer to use a CDN to load the needed files, fullPage.js is in, [JSDelivr](https://www.jsdelivr.com/package/npm/fullpage.js), [UNPKG](https://unpkg.com/browse/fullpage.js/dist/), [CDNJS](https://cdnjs.com/libraries/fullPage.js) and others.\r\n\r\n### Required HTML structure\r\nStart your HTML document with the compulsory [HTML DOCTYPE declaration](https://www.corelangs.com/html/introduction/doctype.html) on the 1st line of your HTML code. You might have troubles with sections heights otherwise. The examples provided use HTML 5 doctype `<!DOCTYPE html>`.\r\n\r\nEach section will be defined with an element containing the `section` class.\r\nThe active section by default will be the first section, which is taken as the home page.\r\n\r\nSections should be placed inside a wrapper (`<div id=\"fullpage\">` in this case). The wrapper can not be the `body` element.\r\n\r\n```html\r\n<div id=\"fullpage\">\r\n\t<div class=\"section\">Some section</div>\r\n\t<div class=\"section\">Some section</div>\r\n\t<div class=\"section\">Some section</div>\r\n\t<div class=\"section\">Some section</div>\r\n</div>\r\n```\r\n\r\nIf you want to define a different starting point rather than the first section or the first slide of a section, just add the class `active` to the section and slide you want to load first.\r\n\r\n```html\r\n<div class=\"section active\">Some section</div>\r\n```\r\n\r\nIn order to create a landscape slider within a section, each slide will be defined by default with an element containing the `slide` class:\r\n\r\n```html\r\n<div class=\"section\">\r\n\t<div class=\"slide\"> Slide 1 </div>\r\n\t<div class=\"slide\"> Slide 2 </div>\r\n\t<div class=\"slide\"> Slide 3 </div>\r\n\t<div class=\"slide\"> Slide 4 </div>\r\n</div>\r\n```\r\n\r\nYou can see a fully working example of the HTML structure in the [`simple.html` file](https://github.com/alvarotrigo/fullPage.js/blob/master/examples/simple.html).\r\n\r\n### Initialization\r\n\r\n#### Initialization with Vanilla Javascript\r\nAll you need to do is call fullPage.js before the closing `</body>` tag.\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\t//options here\r\n\tautoScrolling:true,\r\n\tscrollHorizontally: true\r\n});\r\n```\r\n\r\n#### Initialization with jQuery\r\nYou can use fullpage.js as a jQuery plugin if you want to!\r\n\r\n```javascript\r\n$(document).ready(function() {\r\n\t$('#fullpage').fullpage({\r\n\t\t//options here\r\n\t\tautoScrolling:true,\r\n\t\tscrollHorizontally: true\r\n\t});\r\n\r\n\t// Example of how to use fullpage.js methods\r\n\t$.fn.fullpage.setAllowScrolling(false);\r\n});\r\n```\r\n\r\n#### Vanilla JS example with all options\r\nA more complex initialization with all options set could look like this:\r\n```javascript\r\n\r\nvar myFullpage = new fullpage('#fullpage', {\r\n\t// Navigation\r\n\tmenu: '#menu',\r\n\tlockAnchors: false,\r\n\tanchors:['firstPage', 'secondPage'],\r\n\tnavigation: false,\r\n\tnavigationPosition: 'right',\r\n\tnavigationTooltips: ['firstSlide', 'secondSlide'],\r\n\tshowActiveTooltip: false,\r\n\tslidesNavigation: false,\r\n\tslidesNavPosition: 'bottom',\r\n\r\n\t// Scrolling\r\n\tcss3: true,\r\n\tscrollingSpeed: 700,\r\n\tautoScrolling: true,\r\n\tfitToSection: true,\r\n\tfitToSectionDelay: 600,\r\n\tscrollBar: false,\r\n\teasing: 'easeInOutCubic',\r\n\teasingcss3: 'ease',\r\n\tloopBottom: false,\r\n\tloopTop: false,\r\n\tloopHorizontal: true,\r\n\tcontinuousVertical: false,\r\n\tcontinuousHorizontal: false,\r\n\tscrollHorizontally: false,\r\n\tinterlockedSlides: false,\r\n\tdragAndMove: false,\r\n\toffsetSections: false,\r\n\tresetSliders: false,\r\n\tfadingEffect: false,\r\n\tnormalScrollElements: '#element1, .element2',\r\n\tscrollOverflow: true,\r\n\tscrollOverflowMacStyle: false,\r\n\tscrollOverflowReset: false,\r\n\tskipIntermediateItems: false,\r\n\ttouchSensitivity: 15,\r\n\tbigSectionsDestination: null,\r\n\tadjustOnNavChange: true,\r\n\r\n\t// Accessibility\r\n\tkeyboardScrolling: true,\r\n\tanimateAnchor: true,\r\n\trecordHistory: true,\r\n\r\n\t// Design\r\n\tcontrolArrows: true,\r\n\tcontrolArrowsHTML: [\r\n\t\t'<div class=\"fp-arrow\"></div>', \r\n\t\t'<div class=\"fp-arrow\"></div>'\r\n\t],\r\n\tverticalCentered: true,\r\n\tsectionsColor : ['#ccc', '#fff'],\r\n\tpaddingTop: '3em',\r\n\tpaddingBottom: '10px',\r\n\tfixedElements: '#header, .footer',\r\n\tresponsiveWidth: 0,\r\n\tresponsiveHeight: 0,\r\n\tresponsiveSlides: false,\r\n\teffects: false,\r\n\teffectsOptions: [Object],\r\n\tcinematic: false,\r\n\tcinematicOptions: [Object],\r\n\tparallax: false,\r\n\tparallaxOptions: {type: 'reveal', percentage: 62, property: 'translate'},\r\n\tdropEffect: false,\r\n\tdropEffectOptions: { speed: 2300, color: '#F82F4D', zIndex: 9999},\r\n\twaterEffect: false,\r\n\twaterEffectOptions: { animateContent: true, animateOnMouseMove: true},\r\n\tcards: false,\r\n\tcardsOptions: {perspective: 100, fadeContent: true, fadeBackground: true},\r\n\r\n\t// Custom selectors\r\n\tsectionSelector: '.section',\r\n\tslideSelector: '.slide',\r\n\r\n\tlazyLoading: true,\r\n\tlazyLoadThreshold: 0,\r\n\tobserver: true,\r\n\tcredits: { enabled: true, label: 'Made with fullPage.js', position: 'right'},\r\n\r\n\t// Events\r\n\tbeforeLeave: function(origin, destination, direction, trigger){},\r\n\tonLeave: function(origin, destination, direction, trigger){},\r\n\tafterLoad: function(origin, destination, direction, trigger){},\r\n\tafterRender: function(){},\r\n\tafterResize: function(width, height){},\r\n\tafterReBuild: function(){},\r\n\tafterResponsive: function(isResponsive){},\r\n\tafterSlideLoad: function(section, origin, destination, direction, trigger){},\r\n\tonSlideLeave: function(section, origin, destination, direction, trigger){},\r\n\tonScrollOverflow: function(section, slide, position, direction){}\r\n});\r\n```\r\n\r\n### Creating links to sections or slides\r\nIf you are using fullPage.js with anchor links for the sections (using the `anchors` option or the attribute `data-anchor` in each section), then you will be able to use anchor links also to navigate directly to a certain slide inside a section.\r\n\r\nThis would be an example of a link with an anchor: https://alvarotrigo.com/fullPage/#secondPage/2 (which is the URL you will see once you access to that section/slide manually)\r\nNotice the last part of the URL ends in `#secondPage/2`.\r\n\r\nHaving the following initialization:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors:['firstPage', 'secondPage', 'thirdPage']\r\n});\r\n```\r\n\r\nThe anchor at the end of the URL `#secondPage/2` defines the section and slide of destination respectively. In the previous URL, the section of destination will be the one defined with the anchor `secondPage` and the slide will be the 2nd slide, as we are using the index `2` for it. (the fist slide of a section has index 0, as technically it is a section).\r\n\r\nWe could have used a custom anchor for the slide instead of its index if we would have used the attribute `data-anchor` on the HTML markup like so:\r\n\r\n```html\r\n<div class=\"section\">\r\n\t<div class=\"slide\" data-anchor=\"slide1\"> Slide 1 </div>\r\n\t<div class=\"slide\" data-anchor=\"slide2\"> Slide 2 </div>\r\n\t<div class=\"slide\" data-anchor=\"slide3\"> Slide 3 </div>\r\n\t<div class=\"slide\" data-anchor=\"slide4\"> Slide 4 </div>\r\n</div>\r\n```\r\nIn this last case, the URL we would use would be `#secondPage/slide3`, which is the equivalent to our previous `#secondPage/2`.\r\n\r\nNote that section anchors can also be defined in the same way, by using the `data-anchor` attribute, if no `anchors` array is provided.\r\n\r\n**Be careful!** `data-anchor` tags can not have the same value as any ID element on the site (or NAME element for IE).\r\n\r\n### Creating smaller or bigger sections\r\n[Demo](https://codepen.io/alvarotrigo/pen/BKjRYm) fullPage.js provides a way to remove the full height restriction from its sections and slides. It is possible to create sections which height is smaller or bigger than the viewport. This is ideal for footers.\r\nIt is important to realise that it doesn't make sense to have all of your sections using this feature. If there is more than one section in the initial load of the site, fullPage.js won't scroll at all to see the next one as it will be already in the viewport.\r\n\r\nTo create smaller sections just use the class `fp-auto-height` in the section you want to apply it. It will then take the height defined by your section/slide content.\r\n\r\n```html\r\n<div class=\"section\">Whole viewport</div>\r\n<div class=\"section fp-auto-height\">Auto height</div>\r\n```\r\n\r\n#### Responsive auto height sections\r\n[Demo](https://codepen.io/alvarotrigo/pen/MzByMa) A responsive auto height can be applied by using the class `fp-auto-height-responsive`. This way sections will be fullscreen until the responsive mode gets fired. Then they'll take the size required by their content, which could be bigger or smaller than the viewport.\r\n\r\n### State classes added by fullpage.js\r\nFullpage.js adds multiple classes in different elements to keep a record of the status of the site:\r\n\r\n- `active` is added the current visible section and slide.\r\n- `active` is added to the current menu element (if using the `menu` option).\r\n- `fp-loaded` is added to the section or slide that triggers lazy loading of media content.\r\n- A class of the form `fp-viewing-SECTION-SLIDE` is added to the `body` element of the site. (eg: [`fp-viewing-secondPage-0`](https://alvarotrigo.com/fullPage/#secondPage)) The `SECTION` and `SLIDE` parts will be the anchors (or indexes if no anchor is provided) of the current section and slide.\r\n- `fp-responsive` is added to the `body` element when the entering in the responsive mode\r\n- `fp-enabled` is added to the `html` element when fullpage.js is enabled. (and removed when destroyed).\r\n- `fp-destroyed` is added to the fullpage.js container when fullPage.js is destroyed.\r\n\r\n### Lazy Loading\r\n[Demo](https://codepen.io/alvarotrigo/pen/eNLBXo) fullPage.js provides a way to lazy load images, videos and audio elements so they won't slow down the loading of your site or unnecessarily waste data transfer.\r\nWhen using lazy loading, all these elements will only get loaded when entering in the viewport.\r\nTo enable lazy loading all you need to do is change your `src` attribute to `data-src` as shown below:\r\n\r\n```html\r\n<img data-src=\"image.png\">\r\n<video>\r\n\t<source data-src=\"video.webm\" type=\"video/webm\" />\r\n\t<source data-src=\"video.mp4\" type=\"video/mp4\" />\r\n</video>\r\n ```\r\n\r\nIf you already use another lazy load solution which uses `data-src` as well, you can disable the fullPage.js lazy loading by setting the option `lazyLoading: false`.\r\n\r\n### Auto play/pause embedded media\r\n\r\n[Demo](https://codepen.io/alvarotrigo/pen/pXEaaK) **Note**: the autoplay feature might not work on some mobile devices depending on the OS and browser (i.e. [Safari on iOS](https://webkit.org/blog/6784/new-video-policies-for-ios/) version < 10.0).\r\n\r\n#### Play on section/slide load:\r\nUsing the attribute `autoplay` for videos or audio, or the param `autoplay=1` for youtube iframes will result in the media element playing on page load.\r\nIn order to play it on section/slide load use instead the attribute `data-autoplay`. For example:\r\n\r\n```html\r\n<audio data-autoplay>\r\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\r\n</audio>\r\n```\r\n\r\n#### Pause on leave\r\nEmbedded HTML5 `<video>` / `<audio>`  and Youtube iframes are automatically paused when you navigate away from a section or slide. This can be disabled by using the attribute `data-keepplaying`. For example:\r\n```html\r\n<audio data-keepplaying>\r\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\r\n</audio>\r\n```\r\n\r\n### Use extensions\r\nfullpage.js [provides a set of extensions](https://alvarotrigo.com/fullPage/extensions/) you can use to enhance its default features. All of them are listed as [fullpage.js options](https://github.com/alvarotrigo/fullPage.js#options).\r\n\r\nExtensions requires you to use the minified file [`fullpage.extensions.min.js`](https://github.com/alvarotrigo/fullPage.js/blob/master/dist/fullpage.extensions.min.js) that is inside the [`dist` folder](https://github.com/alvarotrigo/fullPage.js/tree/master/dist) instead of the usual fullPage.js file (`fullpage.js` or `fullpage.min.js`).\r\n\r\nOnce you acquire the extension file, you will need to add it before fullPage. For example, if I want to use the Continuous Horizontal extension, I would have include the extension file and then the extensions version of the fullPage file.\r\n\r\n```html\r\n<script type=\"text/javascript\" src=\"fullpage.continuousHorizontal.min.js\"></script>\r\n<script type=\"text/javascript\" src=\"fullpage/fullpage.extensions.min.js\"></script>\r\n```\r\n\r\nAn activation key and a license key will be required for each extension. [See more details about it here](https://github.com/alvarotrigo/fullPage.js/wiki/How-to-activate-a-fullPage.js-extension).\r\n\r\nThen you will be able to use and configure them as explained in [options](https://github.com/alvarotrigo/fullPage.js#options).\r\n\r\n## Options\r\n\r\n### licenseKey\r\n \r\n(default `null`). **This option is compulsory.** If you use fullPage in a non open source project, then you should use the license key provided on the purchase of the fullPage Commercial License. If your project is open source and it is compatible with the GPLv3 license you can [request a license key](https://alvarotrigo.com/fullPage/extensions/requestKey.html). Please read more about licenses [here](https://github.com/alvarotrigo/fullPage.js#license) and [on the website](https://alvarotrigo.com/fullPage/pricing/). Example of usage:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tlicenseKey: 'YOUR_KEY_HERE'\r\n});\r\n```\r\n\r\n### controlArrows\r\n\r\n(default `true`) Determines whether to use control arrows for the slides to move right or left.\r\n\r\n### controlArrowsHTML\r\n\r\n(default `['<div class=\"fp-arrow\"></div>', '<div class=\"fp-arrow\"></div>'],`).\r\nProvides a way to define the HTML structure and the classes that you want to apply to the control arrows for sections with horizontal slides. The array contains the structure for both arrows. The first item is the left arrow and the second, the right one.\r\n\r\n### verticalCentered\r\n\r\n(default `true`) Vertically centering of the content using flexbox. You might want to wrap your content in a `div` to avoid potential issues. (Uses `flex-direction: column; display: flex; justify-content: center;`)\r\n\r\n### scrollingSpeed\r\n\r\n(default `700`) Speed in milliseconds for the scrolling transitions.\r\n\r\n### sectionsColor\r\n\r\n(default `none`) Define the CSS `background-color` property for each section.\r\nExample:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tsectionsColor: ['#f2f2f2', '#4BBFC3', '#7BAABE', 'whitesmoke', '#000'],\r\n});\r\n```\r\n\r\n### anchors\r\n\r\n(default `[]`) Defines the anchor links (#example) to be shown on the URL for each section. Anchors value should be unique. The position of the anchors in the array will define to which sections the anchor is applied. (second position for second section and so on). Using anchors forward and backward navigation will also be possible through the browser. This option also allows users to bookmark a specific section or slide. **Be careful!** anchors can not have the same value as any ID element on the site (or NAME element for IE).\r\nAnchors can be defined directly in the HTML structure by using the attribute `data-anchor` as explained [here](#creating-links-to-sections-or-slides).\r\n\r\n### lockAnchors\r\n\r\n(default `false`) Determines whether anchors in the URL will have any effect at all in the library. You can still using anchors internally for your own functions and callbacks, but they won't have any effect in the scrolling of the site. Useful if you want to combine fullPage.js with other plugins using anchor in the URL.\r\n\r\n### easing\r\n\r\n(default `easeInOutCubic`) Defines the transition effect to use for the vertical and horizontal scrolling.\r\nIt requires the file `vendors/easings.min.js` or [jQuery UI](https://jqueryui.com/) for using some of [its transitions](https://api.jqueryui.com/easings/). Other libraries could be used instead.\r\n\r\n### easingcss3\r\n\r\n(default `ease`) Defines the transition effect to use in case of using `css3:true`. You can use the [pre-defined ones](https://www.w3schools.com/cssref/css3_pr_transition-timing-function.asp) (such as `linear`, `ease-out`...) or create your own ones using the `cubic-bezier` function. You might want to use [Matthew Lein CSS Easing Animation Tool](https://matthewlein.com/ceaser/) for it.\r\n\r\n### loopTop\r\n\r\n(default `false`) Defines whether scrolling up in the first section should scroll to the last one or not.\r\n\r\n### loopBottom\r\n\r\n(default `false`) Defines whether scrolling down in the last section should scroll to the first one or not.\r\n\r\n### loopHorizontal\r\n\r\n(default `true`) Defines whether horizontal sliders will loop after reaching the last or previous slide or not.\r\n\r\n### css3\r\n\r\n(default `true`) Defines whether to use JavaScript or CSS3 transforms to scroll within sections and slides. Useful to speed up the movement in tablet and mobile devices with browsers supporting CSS3. If this option is set to `true` and the browser doesn't support CSS3, a fallback will be used instead.\r\n\r\n### autoScrolling\r\n\r\n(default `true`) Defines whether to use the \"automatic\" scrolling or the \"normal\" one. It also has affects the way the sections fit in the browser/device window in tablets and mobile phones.\r\n\r\n### fitToSection\r\n\r\n(default `true`) Determines whether or not to fit sections to the viewport or not. When set to `true` the current active section will always fill the whole viewport. Otherwise the user will be free to stop in the middle of a section.\r\n\r\n### fitToSectionDelay\r\n\r\n(default 1000) If `fitToSection` is set to true, this delays the fitting by the configured milliseconds.\r\n\r\n### scrollBar\r\n\r\n(default `false`) Determines whether to use scroll bar for the **vertical sections** on site or not. In case of using scroll bar, the `autoScrolling` functionality will still work as expected. The user will also be free to scroll the site with the scroll bar and fullPage.js will fit the section in the screen when scrolling finishes.\r\n\r\n### paddingTop\r\n\r\n(default `0`) Defines the top padding for each section with a numerical value and its measure (paddingTop: '10px', paddingTop: '10em'...) Useful in case of using a fixed header.\r\n\r\n### paddingBottom\r\n\r\n(default `0`) Defines the bottom padding for each section with a numerical value and its measure (paddingBottom: '10px', paddingBottom: '10em'...). Useful in case of using a fixed footer.\r\n\r\n### fixedElements\r\n\r\n(default `null`) Defines which elements will be taken off the scrolling structure of the plugin which is necessary when using the `css3` option to keep them fixed. It requires a string with the Javascript selectors for those elements. (For example: `fixedElements: '#element1, .element2'`)\r\n\r\n### normalScrollElements\r\n\r\n(default `null`) [Demo](https://codepen.io/alvarotrigo/pen/RmVazM) If you want to avoid the auto scroll when scrolling over some elements, this is the option you need to use. (useful for maps, scrolling divs etc.) It requires a string with the Javascript selectors for those elements. (For example: `normalScrollElements: '#element1, .element2'`). This option should not be applied to any section/slide element itself.\r\n\r\n### bigSectionsDestination\r\n\r\n(default `null`) [Demo](https://codepen.io/alvarotrigo/pen/vYLdMrx) Defines how to scroll to a section which height is bigger than the viewport and when not using `scrollOverflow:true`. (Read [how to create smaller or bigger sections](https://github.com/alvarotrigo/fullPage.js#creating-smaller-or-bigger-sections)). By default fullPage.js scrolls to the top if you come from a section above the destination one and to the bottom if you come from a section below the destination one. Possible values are `top`, `bottom`, `null`.\r\n\r\n### adjustOnNavChange\r\n(default `true`)\r\nDefines whether fullPage.js adjusts the height of sections when the mobile navigation or address bar changes size or toggles visibility. If set to `false`, sections will not appear as full-height when the navigation bar shrinks or hides.\r\n\r\n\r\n### keyboardScrolling\r\n\r\n(default `true`) Defines if the content can be navigated using the keyboard.\r\n\r\n### touchSensitivity\r\n\r\n(default `5`) Defines a percentage of the browsers window width/height, and how far a swipe must measure for navigating to the next section / slide\r\n\r\n### skipIntermediateItems\r\n\r\n(default `false`). Determines whether to skip the scroll animation when navigating between non-consecutive vertical sections or horizontal slides. The possible values are `true`, `false`, `sections`, and `slides`, allowing you to apply this behavior vertically, horizontally, or in both directions.\r\n\r\n### continuousVertical\r\n\r\n(default `false`) Defines whether scrolling down in the last section should scroll down to the first one and if scrolling1 up in the first section should scroll up to the last one. Not compatible with `loopTop`, `loopBottom` or any scroll bar present in the site (`scrollBar:true` or `autoScrolling:false`).\r\n\r\n### continuousHorizontal\r\n\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Defines whether sliding right in the last slide should slide right to the first one or not, and if scrolling left in the first slide should slide left to the last one or not. Not compatible with `loopHorizontal`. Requires fullpage.js >= 3.0.1.\r\n\r\n### scrollHorizontally\r\n\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Defines whether to slide horizontally within sliders by using the mouse wheel or trackpad. It can only be used when using: `autoScrolling:true`. Ideal for story telling. Requires fullpage.js >= 3.0.1.\r\n\r\n### interlockedSlides\r\n\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Determines whether moving one horizontal slider will force the sliding of sliders in other section in the same direction. Possible values are `true`, `false` or an array with the interlocked sections. For example `[1,3,5]` starting by 1. Requires fullpage.js >= 3.0.1.\r\n\r\n### dragAndMove\r\n\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Enables or disables the dragging and flicking of sections and slides by using mouse or fingers. Requires fullpage.js >= 3.0.1. Possible values are:\r\n  - `true`: enables the feature.\r\n  - `false`: disables the feature.\r\n  - `vertical`: enables the feature only vertically.\r\n  - `horizontal`: enables the feature only horizontally.\r\n  - `fingersonly`: enables the feature for touch devices only.\r\n  - `mouseonly`: enables the feature for desktop devices only (mouse and trackpad).\r\n\r\n### offsetSections\r\n\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Provides a way to use non full screen sections based on percentage. Ideal to show visitors there's more content in the site by showing part of the next or previous section. Requires fullPage.js >= 3.0.1.\r\nTo define the percentage of each section the attribute `data-percentage` must be used. The centering of the section in the viewport can be determined by using a boolean value in the attribute `data-centered` (default to `true` if not specified). For example:\r\n``` html\r\n<div class=\"section\" data-percentage=\"80\" data-centered=\"true\">\r\n```\r\n\r\n### resetSliders\r\n\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Defines whether or not to reset every slider after leaving its section. Requires fullpage.js >= 3.0.1.\r\n\r\n### fadingEffect\r\n\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Defines whether to use a fading effect or not instead of the default scrolling one. Possible values are `true`, `false`, `sections`, `slides`. It can therefore be applied just vertically or horizontally, or to both at the time. It can only be used when using: `autoScrolling:true`. Requires fullpage.js >= 3.0.1.\r\n\r\n### animateAnchor\r\n\r\n(default `true`) Defines whether the load of the site when given an anchor (#) will scroll with animation to its destination or will directly load on the given section.\r\n\r\n### recordHistory\r\n\r\n(default `true`) Defines whether to push the state of the site to the browser's history. When set to `true` each section/slide of the site will act as a new page and the back and forward buttons of the browser will scroll the sections/slides to reach the previous or next state of the site. When set to `false`, the URL will keep changing but will have no effect on the browser's history. This option is automatically turned off when using `autoScrolling:false`.\r\n\r\n### menu\r\n\r\n(default `false`) A selector can be used to specify the menu to link with the sections. This way the scrolling of the sections will activate the corresponding element in the menu using the class `active`.\r\nThis won't generate a menu but will just add the `active` class to the element in the given menu with the corresponding anchor links.\r\nIn order to link the elements of the menu with the sections, an HTML 5 data-tag (`data-menuanchor`) will be needed to use with the same anchor links as used within the sections. Example:\r\n```html\r\n<ul id=\"myMenu\">\r\n\t<li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">First section</a></li>\r\n\t<li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second section</a></li>\r\n\t<li data-menuanchor=\"thirdPage\"><a href=\"#thirdPage\">Third section</a></li>\r\n\t<li data-menuanchor=\"fourthPage\"><a href=\"#fourthPage\">Fourth section</a></li>\r\n</ul>\r\n```\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\r\n\tmenu: '#myMenu'\r\n});\r\n```\r\n\r\n**Note:** the menu element should be placed outside the fullpage wrapper in order to avoid problem when using `css3:true`. Otherwise it will be appended to the `body` by the plugin itself.\r\n\r\n### navigation\r\n\r\n(default `false`) If set to `true`, it will show a navigation bar made up of small circles.\r\n\r\n### navigationPosition\r\n\r\n(default `none`) It can be set to `left` or `right` and defines which position the navigation bar will be shown (if using one).\r\n\r\n### navigationTooltips\r\n\r\n(default []) Defines the tooltips to show for the navigation circles in case they are being used. Example: `navigationTooltips: ['firstSlide', 'secondSlide']`. You can also define them by using the attribute `data-tooltip` in each section if you prefer.\r\n\r\n### showActiveTooltip\r\n\r\n(default `false`) Shows a persistent tooltip for the actively viewed section in the vertical navigation.\r\n\r\n### slidesNavigation\r\n\r\n(default `false`) If set to `true` it will show a navigation bar made up of small circles for each landscape slider on the site.\r\n\r\n### slidesNavPosition\r\n\r\n(default `bottom`) Defines the position for the landscape navigation bar for sliders. Admits `top` and `bottom` as values. You may want to modify the CSS styles to determine the distance from the top or bottom as well as any other style such as color.\r\n\r\n### scrollOverflow\r\n\r\n(default `true`) defines whether or not to create a scroll for the section/slide in case its content is bigger than the height of it. It requires the default value `scrollBar: false`. In order to prevent fullpage.js from creating the scrollbar in certain sections or slides use the class `fp-noscroll`. For example: `<div class=\"section fp-noscroll\">` You can also prevent scrolloverflow from getting applied on responsive mode when using `fp-auto-height-responsive` in the section element.\r\n\r\n### scrollOverflowReset\r\n\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Possible values are `true`, `false`, `sections`, `slides`. When set to `true` it scrolls up the content of the section/slide with a scroll bar when leaving to another section/slide. This way the section/slide will always show the start of its content even when scrolling from a section underneath it. Adding the class `fp-no-scrollOverflowReset` on the section or slide will disable this feature for that specific panel.\r\n\r\n### scrollOverflowMacStyle\r\n\r\n(default `false`) When active, this option will use a \"mac style\" for the scrollbar instead of the default one, which will look quite different in Windows computers.\r\n\r\n### sectionSelector\r\n\r\n(default `.section`) Defines the Javascript selector used for the plugin sections. It might need to be changed sometimes to avoid problem with other plugins using the same selectors as fullpage.js.\r\n\r\n### slideSelector\r\n\r\n(default `.slide`) Defines the Javascript selector used for the plugin slides.  It might need to be changed sometimes to avoid problem with other plugins using the same selectors as fullpage.js.\r\n\r\n### responsiveWidth\r\n\r\n(default `0`) A normal scroll (`autoScrolling:false`) will be used under the defined width in pixels. A class `fp-responsive` is added to the body tag in case the user wants to use it for their own responsive CSS. For example, if set to 900, whenever the browser's width is less than 900 the plugin will scroll like a normal site.\r\n\r\n### responsiveHeight\r\n\r\n(default `0`) A normal scroll (`autoScrolling:false`) will be used under the defined height in pixels. A class `fp-responsive` is added to the body tag in case the user wants to use it for their own responsive CSS. For example, if set to 900, whenever the browser's height is less than 900 the plugin will scroll like a normal site.\r\n\r\n### responsiveSlides\r\n\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). When set to `true` slides will be turned into vertical sections when responsive mode is fired. (by using the `responsiveWidth` or `responsiveHeight` options detailed above). Requires fullpage.js >= 3.0.1.\r\n\r\n### cinematic\r\n\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/cinematic.html). Enables or disables the slider effects on sections. Requires fullpage.js >= 4.0.41\r\n\r\n### cinematicOptions\r\n\r\n(default: `{Object}` Allows to configure the parameters for the animation of the content when using the option `cinematic:true`. [Read more](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cinematic-Effects#cinematicoptions).\r\n\r\n### effects\r\n\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/slider-effects.html). Enables or disables the slider effects on sections. Requires fullpage.js >= 4.0.35\r\n\r\n### effectsOptions\r\n\r\n(default: `{Object}` config for the [\"focus\" preset](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#20-available-presets)).\r\nAllows to configure the parameters for the effects when using the option `effects:true`. [Read more about how to apply the effects option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#effects-options-documentation).\r\n\r\n### parallax\r\n\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/parallax.html). Defines whether or not to use the parallax backgrounds effects on sections / slides. Not compatible with `fp-auto-height` sections, `offsetSerctions` and `dragAndMove`.op [Read more about how to apply the parallax option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax).\r\n\r\n### parallaxOptions\r\n\r\n(default: `{ type: 'reveal', percentage: 62, property: 'translate'}`).\r\n\r\nAllows to configure the parameters for the parallax backgrounds effect when using the option `parallax:true`. [Read more about how to apply the parallax option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax).\r\n\r\n### dropEffect\r\n\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Defines whether or not to use the drop effect on sections / slides. [Read more about how to apply the drop effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect).\r\n\r\n### dropEffectOptions\r\n\r\n(default: `{ speed: 2300, color: '#F82F4D', zIndex: 9999}`). \r\n\r\nAllows to configure the parameters for the drop effect when using the option `dropEffect:true`.[Read more about how to apply the drop effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect).\r\n\r\n### waterEffect\r\n\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Defines whether or not to use the water effect on sections / slides. [Read more about how to apply the water effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect).\r\n\r\n### waterEffectOptions\r\n\r\n(default: `{ animateContent: true, animateOnMouseMove: true}`). \r\n\r\nAllows to configure the parameters for the water effect when using the option `waterEffect:true`.[Read more about how to apply the water effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect).\r\n\r\n### cards\r\n\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Defines whether or not to use the cards effect on sections/slides. [Read more about how to apply the cards option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards).\r\n\r\n### cardsOptions\r\n\r\n(default: `{ perspective: 100, fadeContent: true, fadeBackground: true}`).\r\n\r\nAllows you to configure the parameters for the cards effect when using the option `cards:true`. [Read more about how to apply the cards option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards).\r\n\r\n### lazyLoading\r\n\r\n(default `true`) Lazy loading is active by default which means it will lazy load any media element containing the attribute `data-src` as detailed in the [Lazy Loading docs](https://github.com/alvarotrigo/fullPage.js#lazy-loading) . If you want to use any other lazy loading library you can disable this fullpage.js feature.\r\n\r\n### lazyLoadThreshold\r\n(default `0`) Specifies the number of adjacent vertical sections and horizontal slides whose media elements should be lazy-loaded relative to the current one. Use a number to specify how many previous and next sections or slides should be preloaded.\r\n\r\n### observer\r\n\r\n(default `true`) Defines whether or not to observe changes in the HTML structure of the page. When enabled, fullPage.js will automatically react to those changes and update itself accordingly. Ideal when adding, removing or hidding sections or slides.\r\n\r\n### credits\r\n\r\n(default `{enabled: true, label: 'Made with fullpage.js', position: 'right'}`). \r\nDefines whether to use fullPage.js credits. As per clause 0, 4, 5 and 7 of the GPLv3 licecense, those using fullPage. js under the GPLv3 are required to give prominent notice that fullPage.js is in use. We recommend including attribution by keeping this option enabled. **Note:** This option requires a valid value `licenseKey` value.\r\n\r\n## Methods\r\nYou can see them in action [here](https://alvarotrigo.com/fullPage/examples/methods.html)\r\n\r\n### getActiveSection()\r\n[Demo](https://codepen.io/alvarotrigo/pen/VdpzRN/) Gets an Object (type [Section](https://github.com/alvarotrigo/fullPage.js#callbacks)) containing the active section and its properties.\r\n\r\n```javascript\r\nfullpage_api.getActiveSection();\r\n```\r\n\r\n### getActiveSlide()\r\n[Demo](https://codepen.io/alvarotrigo/pen/VdpzRN/) Gets an Object (type [Slide](https://github.com/alvarotrigo/fullPage.js#callbacks)) containing the active slide and its properties.\r\n\r\n```javascript\r\nfullpage_api.getActiveSlide();\r\n```\r\n\r\n### getScrollY() & getScrollX\r\n[Demo](https://codepen.io/alvarotrigo/pen/GRyGqro) `getScrollY` Gets the Y position of the fullPage wrapper. `getScrollX` gets the X position of the active horizontal slide.\r\n\r\n```javascript\r\nfullpage_api.getScrollY();\r\nfullpage_api.getScrollX();\r\n```\r\n\r\n### moveSectionUp()\r\n[Demo](https://codepen.io/alvarotrigo/pen/GJXNMN) Scrolls one section up:\r\n```javascript\r\nfullpage_api.moveSectionUp();\r\n```\r\n---\r\n### moveSectionDown()\r\n[Demo](https://codepen.io/alvarotrigo/pen/jPvVZx) Scrolls one section down:\r\n```javascript\r\nfullpage_api.moveSectionDown();\r\n```\r\n---\r\n### moveTo(section, slide)\r\n[Demo](https://codepen.io/alvarotrigo/pen/doqOmY) Scrolls the page to the given section and slide. The first section will have the index 1 whilst the first slide, the visible one by default, will have index 0.\r\n```javascript\r\n/*Scrolling to the section with the anchor link `firstSlide` and to the 2nd Slide */\r\nfullpage_api.moveTo('firstSlide', 2);\r\n\r\n```\r\n\r\n```javascript\r\n//Scrolling to the 3rd section (with index 3) in the site\r\nfullpage_api.moveTo(3, 0);\r\n\r\n//Which is the same as\r\nfullpage_api.moveTo(3);\r\n```\r\n---\r\n### silentMoveTo(section, slide)\r\n[Demo](https://codepen.io/alvarotrigo/pen/doqOeY)\r\nExactly the same as [`moveTo`](https://github.com/alvarotrigo/fullPage.js#movetosection-slide) but in this case it performs the scroll without animation. A direct jump to the destination.\r\n```javascript\r\n/*Scrolling to the section with the anchor link `firstSlide` and to the 2nd Slide */\r\nfullpage_api.silentMoveTo('firstSlide', 2);\r\n```\r\n---\r\n### moveSlideRight()\r\n[Demo](https://codepen.io/alvarotrigo/pen/Wvgoyz)\r\nScrolls the horizontal slider of the current section to the next slide:\r\n```javascript\r\nfullpage_api.moveSlideRight();\r\n```\r\n---\r\n### moveSlideLeft()\r\n[Demo](https://codepen.io/alvarotrigo/pen/gpdLjW)\r\nScrolls the horizontal slider of the current section to the previous slide:\r\n```javascript\r\nfullpage_api.moveSlideLeft();\r\n```\r\n---\r\n### setAutoScrolling(boolean)\r\n[Demo](https://codepen.io/alvarotrigo/pen/rVZWrR) Sets the scrolling configuration in real time.\r\nDefines the way the page scrolling behaves. If it is set to `true`, it will use the \"automatic\" scrolling, otherwise, it will use the \"manual\" or \"normal\" scrolling of the site.\r\n\r\n```javascript\r\nfullpage_api.setAutoScrolling(false);\r\n```\r\n---\r\n### setFitToSection(boolean)\r\n[Demo](https://codepen.io/alvarotrigo/pen/GJXNYm)\r\nSets the value for the option `fitToSection` determining whether to fit the section in the screen or not.\r\n\r\n```javascript\r\nfullpage_api.setFitToSection(false);\r\n```\r\n---\r\n### fitToSection()\r\n[Demo](https://codepen.io/alvarotrigo/pen/JWWagj)\r\nScrolls to the nearest active section fitting it in the viewport.\r\n\r\n```javascript\r\nfullpage_api.fitToSection();\r\n```\r\n---\r\n### setLockAnchors(boolean)\r\n[Demo](https://codepen.io/alvarotrigo/pen/yNxVRQ)\r\nSets the value for the option `lockAnchors` determining whether anchors will have any effect in the URL or not.\r\n\r\n```javascript\r\nfullpage_api.setLockAnchors(false);\r\n```\r\n---\r\n### setAllowScrolling(boolean, [directions])\r\n[Demo](https://codepen.io/alvarotrigo/pen/EjeNdq) Adds or remove the possibility of scrolling through sections/slides by using the mouse wheel/trackpad or touch gestures (which is active by default). Note this won't disable the keyboard scrolling. You\r\nwould need to use `setKeyboardScrolling` for it.\r\n\r\n- `directions`: (optional parameter) Admitted values: `all`, `up`, `down`, `left`, `right` or a combination of them separated by commas like `down, right`. It defines the direction for which the scrolling will be enabled or disabled.\r\n\r\n```javascript\r\n\r\n//disabling scrolling\r\nfullpage_api.setAllowScrolling(false);\r\n\r\n//disabling scrolling down\r\nfullpage_api.setAllowScrolling(false, 'down');\r\n\r\n//disabling scrolling down and right\r\nfullpage_api.setAllowScrolling(false, 'down, right');\r\n```\r\n---\r\n### setKeyboardScrolling(boolean, [directions])\r\n[Demo](https://codepen.io/alvarotrigo/pen/GJXNwm) Adds or remove the possibility of scrolling through sections by using the keyboard (which is active by default).\r\n\r\n- `directions`: (optional parameter) Admitted values: `all`, `up`, `down`, `left`, `right` or a combination of them separated by commas like `down, right`. It defines the direction for which the scrolling will be enabled or disabled.\r\n\r\n```javascript\r\n//disabling all keyboard scrolling\r\nfullpage_api.setKeyboardScrolling(false);\r\n\r\n//disabling keyboard scrolling down\r\nfullpage_api.setKeyboardScrolling(false, 'down');\r\n\r\n//disabling keyboard scrolling down and right\r\nfullpage_api.setKeyboardScrolling(false, 'down, right');\r\n```\r\n---\r\n### setRecordHistory(boolean)\r\n[Demo](https://codepen.io/alvarotrigo/pen/rVZWQb) Defines whether to record the history for each hash change in the URL.\r\n\r\n```javascript\r\nfullpage_api.setRecordHistory(false);\r\n```\r\n---\r\n### setScrollingSpeed(milliseconds)\r\n[Demo](https://codepen.io/alvarotrigo/pen/NqLbeY) Defines the scrolling speed in milliseconds.\r\n\r\n```javascript\r\nfullpage_api.setScrollingSpeed(700);\r\n```\r\n---\r\n### destroy(type)\r\n[Demo](https://codepen.io/alvarotrigo/pen/bdxBzv) Destroys the plugin events and optionally its HTML markup and styles.\r\nIdeal to use when using AJAX to load content.\r\n\r\n- `type`: (optional parameter) can be empty or `all`. If `all` is passed, the HTML markup and styles used by fullpage.js will be removed. This way the original HTML markup, the one used before any plugin modification is made, will be maintained.\r\n\r\n```javascript\r\n//destroying all Javascript events created by fullPage.js (scrolls, hashchange in the URL...)\r\nfullpage_api.destroy();\r\n\r\n//destroying all Javascript events and any modification done by fullPage.js over your original HTML markup.\r\nfullpage_api.destroy('all');\r\n```\r\n---\r\n### reBuild()\r\nUpdates the DOM structure to fit the new window size or its contents.\r\n Ideal to use in combination with AJAX calls or external changes in the DOM structure of the site, specially when using `scrollOverflow:true`.\r\n\r\n```javascript\r\nfullpage_api.reBuild();\r\n```\r\n---\r\n### setResponsive(boolean)\r\n[Demo](https://codepen.io/alvarotrigo/pen/WxOyLA) Sets the responsive mode of the page. When set to `true` the autoScrolling will be turned off and the result will be exactly the same one as when the `responsiveWidth` or `responsiveHeight` options  get fired.\r\n```javascript\r\nfullpage_api.setResponsive(true);\r\n```\r\n---\r\n### responsiveSlides.toSections()\r\n[Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Requires fullpage.js >= 3.0.1.\r\nTurns horizontal slides into vertical sections.\r\n\r\n```javascript\r\nfullpage_api.responsiveSlides.toSections();\r\n```\r\n---\r\n### responsiveSlides.toSlides()\r\n[Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Requires fullpage.js >= 3.0.1.\r\nTurns back the original slides (now converted into vertical sections) into horizontal slides again.\r\n\r\n```javascript\r\nfullpage_api.responsiveSlides.toSlides();\r\n```\r\n\r\n## Callbacks\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) You can see them in action [here](https://alvarotrigo.com/fullPage/examples/callbacks.html).\r\n\r\nSome callbacks, such as `onLeave` will contain Object type of parameters containing the following properties:\r\n\r\n- `anchor`: *(String)* item's anchor.\r\n- `index`: *(Number)* item's index.\r\n- `item`: *(DOM element)* item element.\r\n- `isFirst`: *(Boolean)* determines if the item is the first child.\r\n- `isLast`: *(Boolean)* determines if the item is the last child.\r\n\r\n### afterLoad (`origin`, `destination`, `direction`, `trigger`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Callback fired once the sections have been loaded, after the scrolling has ended.\r\nParameters:\r\n\r\n- `origin`: *(Object)* section of origin.\r\n- `destination`: *(Object)* destination section.\r\n- `direction`: *(String)* it will take the values `up` or `down` depending on the scrolling direction.\r\n- `trigger`: *(String)* indicates what triggered the scroll. It can be: \"wheel\", \"keydown\", \"menu\", \"slideArrow\", \"verticalNav\", \"horizontalNav\".\r\n\r\nExample:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\r\n\r\n\tafterLoad: function(origin, destination, direction, trigger){\r\n\t\tvar origin = this;\r\n\r\n\t\t//using index\r\n\t\tif(origin.index == 2){\r\n\t\t\talert(\"Section 3 ended loading\");\r\n\t\t}\r\n\r\n\t\t//using anchorLink\r\n\t\tif(origin.anchor == 'secondSlide'){\r\n\t\t\talert(\"Section 2 ended loading\");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n\r\n---\r\n### onLeave (`origin`, `destination`, `direction`, `trigger`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback is fired once the user leaves a section, in the transition to the new section.\r\nReturning `false` will cancel the move before it takes place.\r\n\r\nParameters:\r\n\r\n- `origin`:  *(Object)* section of origin.\r\n- `destination`: *(Object)* destination section.\r\n- `direction`: *(String)* it will take the values `up` or `down` depending on the scrolling direction.\r\n- `trigger`: *(String)* indicates what triggered the scroll. It can be: \"wheel\", \"keydown\", \"menu\", \"slideArrow\", \"verticalNav\", \"horizontalNav\".\r\n\r\nExample:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tonLeave: function(origin, destination, direction, trigger){\r\n\t\tvar leavingSection = this;\r\n\r\n\t\t//after leaving section 2\r\n\t\tif(origin.index == 1 && direction =='down'){\r\n\t\t\talert(\"Going to section 3!\");\r\n\t\t}\r\n\r\n\t\telse if(origin.index == 1 && direction == 'up'){\r\n\t\t\talert(\"Going to section 1!\");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n\r\n\r\n---\r\n### beforeLeave (`origin`, `destination`, `direction`, `trigger`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback is fired right **before** leaving the section, just before the transition takes place.\r\n\r\nYou can use this callback to prevent and cancel the scroll before it takes place by returning `false`.\r\n\r\nParameters:\r\n\r\n- `origin`:  *(Object)* section of origin.\r\n- `destination`: *(Object)* destination section.\r\n- `direction`: *(String)* it will take the values `up` or `down` depending on the scrolling direction.\r\n- `trigger`: *(String)* indicates what triggered the scroll. It can be: \"wheel\", \"keydown\", \"menu\", \"slideArrow\", \"verticalNav\", \"horizontalNav\".\r\n\r\nExample:\r\n\r\n```javascript\r\n\r\nvar cont = 0;\r\nnew fullpage('#fullpage', {\r\n\tbeforeLeave: function(origin, destination, direction, trigger){\r\n\r\n\t\t// prevents scroll until we scroll 4 times\r\n\t\tcont++;\r\n\t\treturn cont === 4;\r\n\t}\r\n});\r\n```\r\n\r\n---\r\n### afterRender()\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback is fired just after the structure of the page is generated. This is the callback you want to use to initialize other plugins or fire any code which requires the document to be ready (as this plugin modifies the DOM to create the resulting structure). See [FAQs](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions) for more info.\r\n\r\nExample:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterRender: function(){\r\n\t\tvar pluginContainer = this;\r\n\t\talert(\"The resulting DOM structure is ready\");\r\n\t}\r\n});\r\n```\r\n---\r\n### afterResize(`width`, `height`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback is fired after resizing the browser's window. Just after the sections are resized.\r\n\r\nParameters:\r\n\r\n- `width`:  *(Number)* window's width.\r\n- `height`: *(Number)* window's height.\r\n\r\nExample:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterResize: function(width, height){\r\n\t\tvar fullpageContainer = this;\r\n\t\talert(\"The sections have finished resizing\");\r\n\t}\r\n});\r\n```\r\n---\r\n### afterReBuild()\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback is fired after manually re-building fullpage.js by calling `fullpage_api.reBuild()`.\r\n\r\nExample:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterReBuild: function(){\r\n\t\tconsole.log(\"fullPage.js has manually being re-builded\");\r\n\t}\r\n});\r\n```\r\n---\r\n### afterResponsive(`isResponsive`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback is fired after fullpage.js changes from normal to responsive mode or from responsive mode to normal mode.\r\n\r\nParameters:\r\n\r\n- `isResponsive`: *(Boolean)* determines if it enters into responsive mode (`true`) or goes back to normal mode (`false`).\r\n\r\nExample:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterResponsive: function(isResponsive){\r\n\t\talert(\"Is responsive: \" + isResponsive);\r\n\t}\r\n});\r\n```\r\n---\r\n### afterSlideLoad (`section`, `origin`, `destination`, `direction`, `trigger`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Callback fired once the slide of a section have been loaded, after the scrolling has ended.\r\n\r\nParameters:\r\n\r\n- `section`: *(Object)* active vertical section.\r\n- `origin`: *(Object)* horizontal slide of origin.\r\n- `destination`: *(Object)* destination horizontal slide.\r\n- `direction`: *(String)* `right` or `left` depending on the scrolling direction.\r\n- `trigger`: *(String)* indicates what triggered the scroll. It can be: \"wheel\", \"keydown\", \"menu\", \"slideArrow\", \"verticalNav\", \"horizontalNav\".\r\n\r\nExample:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\r\n\r\n\tafterSlideLoad: function( section, origin, destination, direction, trigger){\r\n\t\tvar loadedSlide = this;\r\n\r\n\t\t//first slide of the second section\r\n\t\tif(section.anchor == 'secondPage' && destination.index == 1){\r\n\t\t\talert(\"First slide loaded\");\r\n\t\t}\r\n\r\n\t\t//second slide of the second section (supposing #secondSlide is the\r\n\t\t//anchor for the second slide)\r\n\t\tif(section.index == 1 && destination.anchor == 'secondSlide'){\r\n\t\t\talert(\"Second slide loaded\");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n\r\n\r\n---\r\n### onSlideLeave (`section`, `origin`, `destination`, `direction`, `trigger`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback is fired once the user leaves an slide to go to another, in the transition to the new slide.\r\nReturning `false` will cancel the move before it takes place.\r\n\r\nParameters:\r\n\r\n- `section`: *(Object)* active vertical section.\r\n- `origin`: *(Object)* horizontal slide of origin.\r\n- `destination`: *(Object)* destination horizontal slide.\r\n- `direction`: *(String)* `right` or `left` depending on the scrolling direction.\r\n- `trigger`: *(String)* indicates what triggered the scroll. It can be: \"wheel\", \"keydown\", \"menu\", \"slideArrow\", \"verticalNav\", \"horizontalNav\".\r\n\r\nExample:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tonSlideLeave: function( section, origin, destination, direction, trigger){\r\n\t\tvar leavingSlide = this;\r\n\r\n\t\t//leaving the first slide of the 2nd Section to the right\r\n\t\tif(section.index == 1 && origin.index == 0 && direction == 'right'){\r\n\t\t\talert(\"Leaving the fist slide!!\");\r\n\t\t}\r\n\r\n\t\t//leaving the 3rd slide of the 2nd Section to the left\r\n\t\tif(section.index == 1 && origin.index == 2 && direction == 'left'){\r\n\t\t\talert(\"Going to slide 2! \");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n\r\n#### Cancelling a move before it takes place\r\nYou can cancel a move by returning `false` on the `onSlideLeave` callback. [Same as when canceling a movement with `onLeave`](https://github.com/alvarotrigo/fullPage.js#cancelling-the-scroll-before-it-takes-place).\r\n\r\n\r\n---\r\n### onScrollOverflow (`section`, `slide`, `position`, `direction`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback gets fired when a scrolling inside a scrollable section when using the fullPage.js option `scrollOverflow: true`.\r\n\r\nParameters:\r\n\r\n- `section`: *(Object)* active vertical section.\r\n- `slide`: *(Object)* horizontal slide of origin.\r\n- `position`: *(Integer)* scrolled amount within the section/slide. Starts on 0.\r\n- `direction`: *(String)* `up` or `down`\r\n\r\nExample:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tonScrollOverflow: function( section, slide, position, direction){\r\n\t\tconsole.log(section);\r\n\t\tconsole.log(\"position: \" + position);\r\n\t}\r\n});\r\n```\r\n\r\n# Reporting issues\r\n1. Please, look for your issue before asking using the github issues search.\r\n2. Make sure you use the latest fullpage.js version. No support is provided for older versions.\r\n3. Use the [the Github Issues forum](https://github.com/alvarotrigo/fullPage.js/issues) to create issues.\r\n4. **An isolated reproduction of the issue will be required.** Make use of [jsfiddle](https://jsfiddle.net/alvarotrigo/ea17skjr/) or [codepen](https://codepen.io/alvarotrigo/pen/qqabrp) for it if possible.\r\n\r\n# Contributing to fullpage.js\r\nPlease see [Contributing to fullpage.js](https://github.com/alvarotrigo/fullPage.js/wiki/Contributing-to-fullpage.js)\r\n\r\n# Changelog\r\nTo see the list of recent changes, see [Releases section](https://github.com/alvarotrigo/fullPage.js/releases).\r\n\r\n# Build tasks\r\nWant to build fullpage.js distribution files? Please see [Build Tasks](https://github.com/alvarotrigo/fullPage.js/wiki/Build-tasks)\r\n\r\n# Resources\r\n- Wordpress Plugin [for Gutenberg](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/) and [for Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/).\r\n- [Wordpress theme](https://alvarotrigo.com/fullPage/utils/wordpress.html)\r\n- [Official Vue.js wrapper component](https://github.com/alvarotrigo/vue-fullpage.js)\r\n- [Official React.js wrapper component](https://github.com/alvarotrigo/react-fullpage)\r\n- [Official Angular wrapper component](https://github.com/alvarotrigo/angular-fullpage)\r\n- [CSS Easing Animation Tool - Matthew Lein](https://matthewlein.com/ceaser/) (useful to define the `easingcss3` value)\r\n- [fullPage.js jsDelivr CDN](https://www.jsdelivr.com/package/npm/fullpage.js)\r\n- [fullPage.js plugin for October CMS](https://github.com/freestream/oc-parallax-plugin)\r\n- [fullPage.js Angular2 directive](https://github.com/meiblorn/ng2-fullpage)\r\n- [fullPage.js angular directive](https://github.com/hellsan631/angular-fullpage.js)\r\n- [fullPage.js ember-cli addon](https://www.npmjs.com/package/ember-cli-fullpagejs)\r\n- [fullPage.js Rails Ruby Gem](https://rubygems.org/gems/fullpagejs-rails)\r\n- [Angular fullPage.js - Adaptation for Angular.js v1.x](https://github.com/mmautomatizacion/angular-fullpage.js)\r\n- [Integrating fullPage.js with Wordpress (Tutorial)](https://premium.wpmudev.org/blog/build-apple-inspired-full-page-scrolling-pages-for-your-wordpress-site/)\r\n- [Wordpress Plugin for Divi](https://alvarotrigo.com/fullPage/wordpress-plugin-divi/)\r\n- [Wordpress Plugin for Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/)\r\n\r\n## Who is using fullPage.js\r\n\r\n![Who is using fullPage.js](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/using-fullpage.png)\r\n\r\n- http://www.bbc.co.uk/news/resources/idt-d88680d1-26f2-4863-be95-83298fd01e02\r\n- http://medoff.ua/en/\r\n- http://promo.prestigio.com/grace1/\r\n- http://torchbrowser.com/\r\n- http://www.boxreload.com/\r\n- http://boxx.hk/\r\n- http://www.villareginateodolinda.it\r\n\r\n## Sponsors\r\nBecome a sponsor and get your logo on our README on Github with a link to your site. [[Contact Us](https://alvarotrigo.com/#contact)] | [[Become a Patreon]](https://www.patreon.com/fullpagejs) | [Become a GitHub Sponsor](https://github.com/sponsors/alvarotrigo)\r\n\r\n[![Warp](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/warp.png)](http://go.warp.dev/fullPage)\r\n[![Crawlbase](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/crawlbase.png)](https://crawlbase.com/?utm_source=github&utm_medium=sponsor&utm_campaign=fullpagejs)\r\n[![TestMu](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/testmu-ai.png)](https://www.testmu.com/?utm_source=fullpagejs&utm_medium=sponsor)\r\n[![Codeless](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codeless.png)](https://codeless.co)\r\n[![Stackpath](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/stackpath3.png)](https://www.stackpath.com/)\r\n[![Browserstack](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/browserstack3.png)](http://www.browserstack.com/)\r\n[![CodePen](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codepen3.png)](https://codepen.com)\r\n\r\n### People\r\n<a href=\"https://github.com/donsalvadori\" target=\"_blank\" rel=\"nofollow\">\r\n\t<img src=\"http://wallpapers-for-ipad.com/fullpage/imgs3/avatars/donsalvadori.jpg\">\r\n</a>\r\n\r\n## Contributors\r\n\r\n<a href=\"https://github.com/alvarotrigo/fullPage.js/graphs/contributors\">\r\n  <img src=\"https://contrib.rocks/image?repo=alvarotrigo/fullPage.js&max=400&columns=25&anon=1&v=2\" />\r\n</a>\r\n"
  },
  {
    "path": "SECURITY.md",
    "content": "You can privately report issues at help@alvarotrigo.com"
  },
  {
    "path": "bower.json",
    "content": "{\n  \"name\": \"fullpage.js\",\n  \"homepage\": \"http://alvarotrigo.com/fullPage/\",\n  \"authors\": [\n    \"Alvaro Trigo https://github.com/alvarotrigo\"\n  ],\n  \"description\": \"Create  beautiful fullscreen scrolling websites\",\n  \"main\": [\n    \"dist/fullpage.js\",\n    \"dist/fullpage.css\"\n  ],\n  \"keywords\": [\n    \"jquery\",\n    \"scrolling\",\n    \"single_page\",\n    \"one_page\",\n    \"sliding\",\n    \"snap\",\n    \"scroll\",\n    \"sections\",\n    \"slides\",\n    \"swipe\",\n    \"mousewheel\",\n    \"onepage\",\n    \"slidehow\"\n  ],\n  \"license\": \"GPL-3.0\",\n  \"ignore\": [\n    \"**/.*\",\n    \"node_modules\",\n    \"bower_components\",\n    \"test\",\n    \"tests\",\n    \"examples\"\n  ]\n}\n"
  },
  {
    "path": "dist/fullpage.css",
    "content": "/*!\r\n * fullPage 4.0.41\r\n * https://github.com/alvarotrigo/fullPage.js\r\n *\r\n * @license GPLv3 for open source use only\r\n * or Fullpage Commercial License for commercial use\r\n * http://alvarotrigo.com/fullPage/pricing/\r\n *\r\n * Copyright (C) 2021 http://alvarotrigo.com/fullPage - A project by Alvaro Trigo\r\n */\r\nhtml.fp-enabled,\r\n.fp-enabled body {\r\n    margin: 0;\r\n    padding: 0;\r\n    overflow:hidden;\r\n\r\n    /*Avoid flicker on slides transitions for mobile phones #336 */\r\n    -webkit-tap-highlight-color: rgba(0,0,0,0);\r\n}\r\n.fp-section {\r\n    position: relative;\r\n    -webkit-box-sizing: border-box; /* Safari<=5 Android<=3 */\r\n    -moz-box-sizing: border-box; /* <=28 */\r\n    box-sizing: border-box;\r\n    height: 100%;\r\n    display: block;\r\n}\r\n.fp-slide {\r\n    float: left;\r\n}\r\n.fp-slide, .fp-slidesContainer {\r\n    height: 100%;\r\n    display: block;\r\n}\r\n.fp-slides {\r\n    z-index:1;\r\n    height: 100%;\r\n    overflow: hidden;\r\n    position: relative;\r\n    -webkit-transition: all 0.3s ease-out; /* Safari<=6 Android<=4.3 */\r\n    transition: all 0.3s ease-out;\r\n}\r\n.fp-table{\r\n    display: flex;\r\n    flex-direction: column;\r\n    justify-content: center;\r\n    width: 100%;\r\n}\r\n.fp-slidesContainer {\r\n    float: left;\r\n    position: relative;\r\n}\r\n.fp-controlArrow {\r\n    -webkit-user-select: none; /* webkit (safari, chrome) browsers */\r\n    -moz-user-select: none; /* mozilla browsers */\r\n    -khtml-user-select: none; /* webkit (konqueror) browsers */\r\n    -ms-user-select: none; /* IE10+ */\r\n    position: absolute;\r\n    z-index: 4;\r\n    top: 50%;\r\n    cursor: pointer;\r\n    margin-top: -38px;\r\n    -webkit-transform: translate3d(0,0,0);\r\n    -ms-transform: translate3d(0,0,0);\r\n    transform: translate3d(0,0,0);\r\n}\r\n.fp-prev{\r\n    left: 15px;\r\n}\r\n.fp-next{\r\n    right: 15px;\r\n}\r\n.fp-arrow{\r\n    width: 0;\r\n    height: 0;\r\n    border-style: solid;\r\n}\r\n.fp-arrow.fp-prev {\r\n    border-width: 38.5px 34px 38.5px 0;\r\n    border-color: transparent #fff transparent transparent;\r\n}\r\n.fp-arrow.fp-next {\r\n    border-width: 38.5px 0 38.5px 34px;\r\n    border-color: transparent transparent transparent #fff;\r\n}\r\n.fp-notransition {\r\n    -webkit-transition: none !important;\r\n    transition: none !important;\r\n}\r\n#fp-nav {\r\n    position: fixed;\r\n    z-index: 100;\r\n    top: 50%;\r\n    opacity: 1;\r\n    transform: translateY(-50%);\r\n    -ms-transform: translateY(-50%);\r\n    -webkit-transform: translate3d(0,-50%,0);\r\n    pointer-events: none;\r\n}\r\n#fp-nav.fp-right {\r\n    right: 17px;\r\n}\r\n#fp-nav.fp-left {\r\n    left: 17px;\r\n}\r\n.fp-slidesNav{\r\n    position: absolute;\r\n    z-index: 4;\r\n    opacity: 1;\r\n    -webkit-transform: translate3d(0,0,0);\r\n    -ms-transform: translate3d(0,0,0);\r\n    transform: translate3d(0,0,0);\r\n    left: 0 !important;\r\n    right: 0;\r\n    margin: 0 auto !important;\r\n    pointer-events: none;\r\n}\r\n.fp-slidesNav.fp-bottom {\r\n    bottom: 17px;\r\n}\r\n.fp-slidesNav.fp-top {\r\n    top: 17px;\r\n}\r\n#fp-nav ul,\r\n.fp-slidesNav ul {\r\n  margin: 0;\r\n  padding: 0;\r\n}\r\n#fp-nav ul li,\r\n.fp-slidesNav ul li {\r\n    display: block;\r\n    width: 14px;\r\n    height: 13px;\r\n    margin: 7px;\r\n    position:relative;\r\n}\r\n.fp-slidesNav ul li {\r\n    display: inline-block;\r\n}\r\n#fp-nav ul li a,\r\n.fp-slidesNav ul li a {\r\n    display: block;\r\n    position: relative;\r\n    z-index: 1;\r\n    width: 100%;\r\n    height: 100%;\r\n    cursor: pointer;\r\n    text-decoration: none;\r\n    pointer-events: all;\r\n}\r\n#fp-nav ul li a.active span,\r\n.fp-slidesNav ul li a.active span,\r\n#fp-nav ul li:hover a.active span,\r\n.fp-slidesNav ul li:hover a.active span{\r\n    height: 12px;\r\n    width: 12px;\r\n    margin: -6px 0 0 -6px;\r\n    border-radius: 100%;\r\n }\r\n#fp-nav ul li a span,\r\n.fp-slidesNav ul li a span {\r\n    border-radius: 50%;\r\n    position: absolute;\r\n    z-index: 1;\r\n    height: 4px;\r\n    width: 4px;\r\n    border: 0;\r\n    background: #333;\r\n    left: 50%;\r\n    top: 50%;\r\n    margin: -2px 0 0 -2px;\r\n    -webkit-transition: all 0.1s ease-in-out;\r\n    -moz-transition: all 0.1s ease-in-out;\r\n    -o-transition: all 0.1s ease-in-out;\r\n    transition: all 0.1s ease-in-out;\r\n}\r\n#fp-nav ul li:hover a span,\r\n.fp-slidesNav ul li:hover a span{\r\n    width: 10px;\r\n    height: 10px;\r\n    margin: -5px 0px 0px -5px;\r\n}\r\n#fp-nav ul li .fp-tooltip {\r\n    position: absolute;\r\n    top: -2px;\r\n    color: #fff;\r\n    font-size: 14px;\r\n    font-family: arial, helvetica, sans-serif;\r\n    white-space: nowrap;\r\n    max-width: 220px;\r\n    overflow: hidden;\r\n    display: block;\r\n    opacity: 0;\r\n    width: 0;\r\n    cursor: pointer;\r\n}\r\n#fp-nav ul li:hover .fp-tooltip,\r\n#fp-nav.fp-show-active a.active + .fp-tooltip {\r\n    -webkit-transition: opacity 0.2s ease-in;\r\n    transition: opacity 0.2s ease-in;\r\n    width: auto;\r\n    opacity: 1;\r\n}\r\n#fp-nav ul li .fp-tooltip.fp-right {\r\n    right: 20px;\r\n}\r\n#fp-nav ul li .fp-tooltip.fp-left {\r\n    left: 20px;\r\n}\r\n.fp-auto-height.fp-section,\r\n.fp-auto-height .fp-slide{\r\n    height: auto !important;\r\n}\r\n\r\n.fp-responsive .fp-is-overflow.fp-section{\r\n    height: auto !important;\r\n}\r\n\r\n/* Tries to prevent overwrites #4657 */\r\n.fp-enabled .fp-scrollable{\r\n    overflow: visible;\r\n    height: initial;\r\n}\r\n\r\n/* Used with autoScrolling: false */ \r\n.fp-scrollable.fp-responsive .fp-is-overflow.fp-section,\r\n.fp-scrollable .fp-section,\r\n.fp-scrollable .fp-slide{\r\n   /* Fallback for browsers that do not support Custom Properties */\r\n   height: 100vh;\r\n   height: calc(var(--vh, 1vh) * 100);\r\n}\r\n\r\n.fp-scrollable.fp-responsive .fp-is-overflow.fp-section:not(.fp-auto-height):not([data-percentage]),\r\n.fp-scrollable .fp-section:not(.fp-auto-height):not([data-percentage]),\r\n.fp-scrollable .fp-slide:not(.fp-auto-height):not([data-percentage]){\r\n    /* Fallback for browsers that do not support Custom Properties */\r\n    min-height: 100vh;\r\n    min-height: calc(var(--vh, 1vh) * 100);\r\n}\r\n\r\n/* Disabling vertical centering on scrollable elements */\r\n.fp-overflow{\r\n    justify-content: flex-start;\r\n    width: 100%; /* In case its necessary #4717 */\r\n}\r\n\r\nbody:not(.fp-responsive) .fp-overflow{\r\n    max-height: 100vh;\r\n    max-height: 100dvh; /* fix for new browsers */\r\n}\r\n\r\n/* No scrollable when using auto-height */\r\n.fp-scrollable .fp-auto-height .fp-overflow{\r\n    max-height: none;\r\n}\r\n\r\n.fp-is-overflow .fp-overflow.fp-auto-height-responsive,\r\n.fp-is-overflow .fp-overflow.fp-auto-height,\r\n.fp-is-overflow .fp-overflow{\r\n    overflow-y: auto;\r\n}\r\n.fp-overflow{\r\n    outline:none;\r\n}\r\n\r\n.fp-overflow.fp-table{\r\n    display: block;\r\n}\r\n\r\n.fp-responsive .fp-auto-height-responsive.fp-section,\r\n.fp-responsive .fp-auto-height-responsive .fp-slide,\r\n.fp-responsive .fp-auto-height-responsive .fp-overflow{\r\n    height: auto !important;\r\n    min-height: auto !important;\r\n}\r\n\r\n/*Only display content to screen readers*/\r\n.fp-sr-only{\r\n    position: absolute;\r\n    width: 1px;\r\n    height: 1px;\r\n    padding: 0;\r\n    overflow: hidden;\r\n    clip: rect(0, 0, 0, 0);\r\n    white-space: nowrap;\r\n    border: 0;\r\n}\r\n\r\n/* Customize website's scrollbar like Mac OS\r\nNot supports in Firefox and IE */\r\n.fp-scroll-mac .fp-overflow::-webkit-scrollbar {\r\n    background-color: transparent;\r\n    width: 9px;\r\n}\r\n.fp-scroll-mac .fp-overflow::-webkit-scrollbar-track {\r\n    background-color: transparent;\r\n}\r\n.fp-scroll-mac .fp-overflow::-webkit-scrollbar-thumb {\r\n    background-color: rgba(0,0,0,.4);\r\n    border-radius: 16px;\r\n    border: 4px solid transparent;\r\n}\r\n.fp-warning,\r\n.fp-watermark{\r\n    z-index: 9999999;\r\n    position: absolute;\r\n    bottom: 0;\r\n}\r\n.fp-warning,\r\n.fp-watermark a{\r\n    text-decoration: none;\r\n    color: #000;\r\n    background: rgba(255,255,255,0.6);\r\n    padding: 5px 8px;\r\n    font-size: 14px;\r\n    font-family: arial;\r\n    color: black;\r\n    display: inline-block;\r\n    border-radius: 3px;\r\n    margin: 12px;\r\n}\r\n.fp-noscroll .fp-overflow{\r\n    overflow: hidden;\r\n}"
  },
  {
    "path": "dist/fullpage.js",
    "content": "/*!\n* fullPage 4.0.41\n* https://github.com/alvarotrigo/fullPage.js\n*\n* @license GPLv3 for open source use only\n* or Fullpage Commercial License for commercial use\n* http://alvarotrigo.com/fullPage/pricing/\n*\n* Copyright (C) 2018 http://alvarotrigo.com/fullPage - A project by Alvaro Trigo\n*/\n\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.fullpage = factory());\n})(this, (function () { 'use strict';\n\n    // https://tc39.github.io/ecma262/#sec-array.prototype.find\n    if (!Array.prototype.find) {\n      Object.defineProperty(Array.prototype, 'find', {\n        value: function value(predicate) {\n          // 1. Let O be ? ToObject(this value).\n          if (this == null) {\n            throw new TypeError('\"this\" is null or not defined');\n          }\n\n          var o = Object(this); // 2. Let len be ? ToLength(? Get(O, \"length\")).\n\n          var len = o.length >>> 0; // 3. If IsCallable(predicate) is false, throw a TypeError exception.\n\n          if (typeof predicate !== 'function') {\n            throw new TypeError('predicate must be a function');\n          } // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.\n\n\n          var thisArg = arguments[1]; // 5. Let k be 0.\n\n          var k = 0; // 6. Repeat, while k < len\n\n          while (k < len) {\n            // a. Let Pk be ! ToString(k).\n            // b. Let kValue be ? Get(O, Pk).\n            // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).\n            // d. If testResult is true, return kValue.\n            var kValue = o[k];\n\n            if (predicate.call(thisArg, kValue, k, o)) {\n              return kValue;\n            } // e. Increase k by 1.\n\n\n            k++;\n          } // 7. Return undefined.\n\n\n          return undefined;\n        }\n      });\n    }\n\n    // Production steps of ECMA-262, Edition 6, 22.1.2.1\n    if (!Array.from) {\n      Array.from = function () {\n        var toStr = Object.prototype.toString;\n\n        var isCallable = function isCallable(fn) {\n          return typeof fn === 'function' || toStr.call(fn) === '[object Function]';\n        };\n\n        var toInteger = function toInteger(value) {\n          var number = Number(value);\n\n          if (isNaN(number)) {\n            return 0;\n          }\n\n          if (number === 0 || !isFinite(number)) {\n            return number;\n          }\n\n          return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));\n        };\n\n        var maxSafeInteger = Math.pow(2, 53) - 1;\n\n        var toLength = function toLength(value) {\n          var len = toInteger(value);\n          return Math.min(Math.max(len, 0), maxSafeInteger);\n        }; // The length property of the from method is 1.\n\n\n        return function from(arrayLike\n        /*, mapFn, thisArg */\n        ) {\n          // 1. Let C be the this value.\n          var C = this; // 2. Let items be ToObject(arrayLike).\n\n          var items = Object(arrayLike); // 3. ReturnIfAbrupt(items).\n\n          if (arrayLike == null) {\n            throw new TypeError('Array.from requires an array-like object - not null or undefined');\n          } // 4. If mapfn is undefined, then let mapping be false.\n\n\n          var mapFn = arguments.length > 1 ? arguments[1] : void undefined;\n          var T;\n\n          if (typeof mapFn !== 'undefined') {\n            // 5. else\n            // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.\n            if (!isCallable(mapFn)) {\n              throw new TypeError('Array.from: when provided, the second argument must be a function');\n            } // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.\n\n\n            if (arguments.length > 2) {\n              T = arguments[2];\n            }\n          } // 10. Let lenValue be Get(items, \"length\").\n          // 11. Let len be ToLength(lenValue).\n\n\n          var len = toLength(items.length); // 13. If IsConstructor(C) is true, then\n          // 13. a. Let A be the result of calling the [[Construct]] internal method\n          // of C with an argument list containing the single item len.\n          // 14. a. Else, Let A be ArrayCreate(len).\n\n          var A = isCallable(C) ? Object(new C(len)) : new Array(len); // 16. Let k be 0.\n\n          var k = 0; // 17. Repeat, while k < len… (also steps a - h)\n\n          var kValue;\n\n          while (k < len) {\n            kValue = items[k];\n\n            if (mapFn) {\n              A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);\n            } else {\n              A[k] = kValue;\n            }\n\n            k += 1;\n          } // 18. Let putStatus be Put(A, \"length\", len, true).\n\n\n          A.length = len; // 20. Return A.\n\n          return A;\n        };\n      }();\n    }\n\n    var win = window;\n    var doc = document;\n    var isTouchDevice = navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/) || navigator.userAgent.includes(\"Mac\") && \"ontouchend\" in document; // iPad on iOS 13 detection\n\n    var isMacDevice = /(Mac|iPhone|iPod|iPad)/i.test(win.navigator.userAgent); // @ts-ignore\n\n    var isTouch = 'ontouchstart' in win || navigator.msMaxTouchPoints > 0 || navigator.maxTouchPoints;\n    var isIE11 = !!window.MSInputMethodContext && !!document.documentMode; // taken from https://github.com/udacity/ud891/blob/gh-pages/lesson2-focus/07-modals-and-keyboard-traps/solution/modal.js\n\n    var focusableElementsString = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex=\"0\"], summary:not([disabled]), [contenteditable]'; // cache common elements\n\n    var FP = {\n      test: {},\n      shared: {}\n    };\n    var extensions = ['parallax', 'scrollOverflowReset', 'dragAndMove', 'offsetSections', 'fadingEffect', 'responsiveSlides', 'continuousHorizontal', 'interlockedSlides', 'scrollHorizontally', 'resetSliders', 'cards', 'dropEffect', 'waterEffect'];\n    var isInsideIframe = function () {\n      var inIframe = window.self !== window.top;\n      return function () {\n        return inIframe;\n      };\n    }();\n\n    /**\n    * forEach polyfill for IE\n    * https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach#Browser_Compatibility\n    */\n\n    if (win.NodeList && !NodeList.prototype.forEach) {\n      NodeList.prototype.forEach = function (callback, thisArg) {\n        thisArg = thisArg || window;\n\n        for (var i = 0; i < this.length; i++) {\n          callback.call(thisArg, this[i], i, this);\n        }\n      };\n    }\n\n    if (typeof Object.assign != 'function') {\n      // Must be writable: true, enumerable: false, configurable: true\n      Object.defineProperty(Object, 'assign', {\n        value: function assign(target, varArgs) {\n\n          if (target == null) {\n            // TypeError if undefined or null\n            throw new TypeError('Cannot convert undefined or null to object');\n          }\n\n          var to = Object(target);\n\n          for (var index = 1; index < arguments.length; index++) {\n            var nextSource = arguments[index];\n\n            if (nextSource != null) {\n              // Skip over if undefined or null\n              for (var nextKey in nextSource) {\n                // Avoid bugs when hasOwnProperty is shadowed\n                if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n                  to[nextKey] = nextSource[nextKey];\n                }\n              }\n            }\n          }\n\n          return to;\n        },\n        writable: true,\n        configurable: true\n      });\n    }\n\n    // https://stackoverflow.com/questions/51719553/padstart-not-working-in-ie11\n    // https://github.com/behnammodi/polyfill/blob/master/string.polyfill.js\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart\n    if (!String.prototype.padStart) {\n      String.prototype.padStart = function padStart(targetLength, padString) {\n        targetLength = targetLength >> 0; //truncate if number or convert non-number to 0;\n\n        padString = String(typeof padString !== 'undefined' ? padString : ' ');\n\n        if (this.length > targetLength) {\n          return String(this);\n        } else {\n          targetLength = targetLength - this.length;\n\n          if (targetLength > padString.length) {\n            padString += Array.apply(null, Array(targetLength)).map(function () {\n              return padString;\n            }).join(\"\");\n          }\n\n          return padString.slice(0, targetLength) + String(this);\n        }\n      };\n    }\n\n    //utils\n    /**\n    * Shows a message in the console of the given type.\n    */\n\n    function showError(type, text) {\n      win.console && win.console[type] && win.console[type]('fullPage: ' + text);\n    }\n    function isVisible(el) {\n      var style = win.getComputedStyle(el);\n      return style.display !== 'none';\n    }\n    function getVisible(elements) {\n      return Array.from(elements).filter(function (e) {\n        return isVisible(e);\n      });\n    }\n    /**\n    * Equivalent of jQuery function $().\n    */\n\n    function $(selector, context) {\n      context = arguments.length > 1 ? context : document;\n      return context ? context.querySelectorAll(selector) : null;\n    }\n    /**\n    * Extends a given Object properties and its childs.\n    */\n\n    function deepExtend(out) {\n      out = out || {};\n\n      for (var i = 1, len = arguments.length; i < len; ++i) {\n        var obj = arguments[i];\n\n        if (!obj) {\n          continue;\n        }\n\n        for (var key in obj) {\n          if (!obj.hasOwnProperty(key) || key == '__proto__' || key == 'constructor') {\n            continue;\n          } // based on https://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/\n\n\n          if (Object.prototype.toString.call(obj[key]) === '[object Object]') {\n            out[key] = deepExtend(out[key], obj[key]);\n            continue;\n          }\n\n          out[key] = obj[key];\n        }\n      }\n\n      return out;\n    }\n    /**\n    * Checks if the passed element contains the passed class.\n    */\n\n    function hasClass(el, className) {\n      if (el == null) {\n        return false;\n      }\n\n      return el.classList.contains(className);\n    }\n    /**\n    * Gets the window height. Crossbrowser.\n    */\n\n    function getWindowHeight() {\n      return 'innerHeight' in win ? win.innerHeight : doc.documentElement.offsetHeight;\n    }\n    /**\n    * Gets the window width.\n    */\n\n    function getWindowWidth() {\n      return win.innerWidth;\n    }\n    /**\n    * Set's the CSS properties for the passed item/s.\n    * @param {NodeList|HTMLElement|Object} items\n    * @param {Object} props css properties and values.\n    */\n\n    function css(items, props) {\n      items = getList(items);\n      var key;\n\n      for (key in props) {\n        if (props.hasOwnProperty(key)) {\n          if (key !== null) {\n            for (var i = 0; i < items.length; i++) {\n              var item = items[i];\n              item.style[key] = props[key];\n            }\n          }\n        }\n      }\n\n      return items;\n    }\n    /**\n    * Gets the previous element to the passed element.\n    */\n\n    function prev(item) {\n      return item.previousElementSibling;\n    }\n    /**\n    * Gets the next element to the passed element.\n    */\n\n    function next(item) {\n      return item.nextElementSibling;\n    }\n    /**\n    * Gets the last element from the passed list of elements.\n    */\n\n    function last(item) {\n      return item[item.length - 1];\n    }\n    /**\n    * Gets index from the passed element.\n    * @param {String} selector is optional.\n    */\n\n    function index(item, selector) {\n      item = isArrayOrList(item) ? item[0] : item;\n      var children = selector != null ? $(selector, item.parentNode) : item.parentNode.childNodes;\n      var num = 0;\n\n      for (var i = 0; i < children.length; i++) {\n        if (children[i] == item) return num;\n        if (children[i].nodeType == 1) num++;\n      }\n\n      return -1;\n    }\n    /**\n    * Gets an iterable element for the passed element/s\n    */\n\n    function getList(item) {\n      return !isArrayOrList(item) ? [item] : item;\n    }\n    /**\n    * Adds the display=none property for the passed element/s\n    */\n\n    function hide(el) {\n      el = getList(el);\n\n      for (var i = 0; i < el.length; i++) {\n        el[i].style.display = 'none';\n      }\n\n      return el;\n    }\n    /**\n    * Adds the display=block property for the passed element/s\n    */\n\n    function show(el) {\n      el = getList(el);\n\n      for (var i = 0; i < el.length; i++) {\n        el[i].style.display = 'block';\n      }\n\n      return el;\n    }\n    /**\n    * Checks if the passed element is an iterable element or not\n    */\n\n    function isArrayOrList(el) {\n      return Object.prototype.toString.call(el) === '[object Array]' || Object.prototype.toString.call(el) === '[object NodeList]';\n    }\n    /**\n    * Adds the passed class to the passed element/s\n    */\n\n    function addClass(el, className) {\n      el = getList(el);\n\n      for (var i = 0; i < el.length; i++) {\n        var item = el[i];\n        item.classList.add(className);\n      }\n\n      return el;\n    }\n    /**\n    * Removes the passed class to the passed element/s\n    * @param {String} `className` can be multiple classnames separated by whitespace\n    */\n\n    function removeClass(el, className) {\n      el = getList(el);\n      var classNames = className.split(' ');\n\n      for (var a = 0; a < classNames.length; a++) {\n        className = classNames[a];\n\n        for (var i = 0; i < el.length; i++) {\n          var item = el[i];\n          item.classList.remove(className);\n        }\n      }\n\n      return el;\n    }\n    /**\n    * Appends the given element ot the given parent.\n    */\n\n    function appendTo(el, parent) {\n      parent.appendChild(el);\n    }\n    /**\n    Usage:\n\n    var wrapper = document.createElement('div');\n    wrapper.className = 'fp-slides';\n    wrap($('.slide'), wrapper);\n\n    https://jsfiddle.net/qwzc7oy3/15/ (vanilla)\n    https://jsfiddle.net/oya6ndka/1/ (jquery equivalent)\n    */\n\n    function wrap(toWrap, wrapper, isWrapAll) {\n      var newParent;\n      wrapper = wrapper || doc.createElement('div');\n\n      for (var i = 0; i < toWrap.length; i++) {\n        var item = toWrap[i];\n\n        if (isWrapAll && !i || !isWrapAll) {\n          newParent = wrapper.cloneNode(true);\n          item.parentNode.insertBefore(newParent, item);\n        }\n\n        newParent.appendChild(item);\n      }\n\n      return toWrap;\n    }\n    /**\n    Usage:\n    var wrapper = document.createElement('div');\n    wrapper.className = 'fp-slides';\n    wrap($('.slide'), wrapper);\n\n    https://jsfiddle.net/qwzc7oy3/27/ (vanilla)\n    https://jsfiddle.net/oya6ndka/4/ (jquery equivalent)\n    */\n\n    function wrapAll(toWrap, wrapper) {\n      wrap(toWrap, wrapper, true);\n    }\n    /**\n    * Usage:\n    * wrapInner(document.querySelector('#pepe'), '<div class=\"test\">afdas</div>');\n    * wrapInner(document.querySelector('#pepe'), element);\n    *\n    * https://jsfiddle.net/zexxz0tw/6/\n    *\n    * https://stackoverflow.com/a/21817590/1081396\n    */\n\n    function wrapInner(parent, wrapper) {\n      parent.appendChild(wrapper);\n\n      while (parent.firstChild !== wrapper) {\n        wrapper.appendChild(parent.firstChild);\n      }\n    }\n    /**\n    * Usage:\n    * unwrap(document.querySelector('#pepe'));\n    * unwrap(element);\n    *\n    * https://jsfiddle.net/szjt0hxq/1/\n    *\n    */\n\n    function unwrap(wrapper) {\n      var wrapperContent = doc.createDocumentFragment();\n\n      while (wrapper.firstChild) {\n        wrapperContent.appendChild(wrapper.firstChild);\n      }\n\n      wrapper.parentNode.replaceChild(wrapperContent, wrapper);\n    }\n    /**\n    * http://stackoverflow.com/questions/22100853/dom-pure-javascript-solution-to-jquery-closest-implementation\n    * Returns the element or `false` if there's none\n    */\n\n    function closest(el, selector) {\n      if (el && el.nodeType === 1) {\n        if (matches(el, selector)) {\n          return el;\n        }\n\n        return closest(el.parentNode, selector);\n      }\n\n      return null;\n    }\n    /**\n    * Places one element (rel) after another one or group of them (reference).\n    * @param {HTMLElement} reference\n    * @param {HTMLElement|NodeList|String|Array} el\n    * https://jsfiddle.net/9s97hhzv/1/\n    */\n\n    function after(reference, el) {\n      insertBefore(reference, reference.nextSibling, el);\n    }\n    /**\n    * Places one element (rel) before another one or group of them (reference).\n    * @param {HTMLElement} reference\n    * @param {HTMLElement|NodeList|String|Array} el\n    * https://jsfiddle.net/9s97hhzv/1/\n    */\n\n    function before(reference, el) {\n      insertBefore(reference, reference, el);\n    }\n    /**\n    * Based in https://stackoverflow.com/a/19316024/1081396\n    * and https://stackoverflow.com/a/4793630/1081396\n    */\n\n    function insertBefore(reference, beforeElement, el) {\n      if (!isArrayOrList(el)) {\n        if (typeof el == 'string') {\n          el = createElementFromHTML(el);\n        }\n\n        el = [el];\n      }\n\n      for (var i = 0; i < el.length; i++) {\n        reference.parentNode.insertBefore(el[i], beforeElement);\n      }\n    } //http://stackoverflow.com/questions/3464876/javascript-get-window-x-y-position-for-scroll\n\n    function getScrollTop() {\n      var docElement = doc.documentElement;\n      return (win.pageYOffset || docElement.scrollTop) - (docElement.clientTop || 0);\n    }\n    /**\n    * Gets the siblings of the passed element\n    */\n\n    function siblings(el) {\n      return Array.prototype.filter.call(el.parentNode.children, function (child) {\n        return child !== el;\n      });\n    }\n    function preventDefault(event) {\n      event.preventDefault();\n    }\n    function getAttr(el, attr) {\n      return el.getAttribute(attr);\n    }\n    function docAddEvent(event, callback, options) {\n      doc.addEventListener(event, callback, options === 'undefined' ? null : options);\n    }\n    function windowAddEvent(event, callback, options) {\n      win.addEventListener(event, callback, options === 'undefined' ? null : options);\n    }\n    function docRemoveEvent(event, callback, options) {\n      doc.removeEventListener(event, callback, options === 'undefined' ? null : options);\n    }\n    function windowRemoveEvent(event, callback, options) {\n      win.removeEventListener(event, callback, options === 'undefined' ? null : options);\n    }\n    /**\n    * Determines whether the passed item is of function type.\n    */\n\n    function isFunction(item) {\n      if (typeof item === 'function') {\n        return true;\n      }\n\n      var type = Object.prototype.toString.call(item);\n      return type === '[object Function]' || type === '[object GeneratorFunction]';\n    }\n    /**\n    * Trigger custom events\n    */\n\n    function trigger(el, eventName, data) {\n      var event;\n      data = typeof data === 'undefined' ? {} : data; // Native\n\n      if (typeof win.CustomEvent === \"function\") {\n        event = new CustomEvent(eventName, {\n          detail: data\n        });\n      } else {\n        event = doc.createEvent('CustomEvent');\n        event.initCustomEvent(eventName, true, true, data);\n      }\n\n      el.dispatchEvent(event);\n    }\n    /**\n    * Polyfill of .matches()\n    */\n\n    function matches(el, selector) {\n      return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector);\n    }\n    /**\n    * Toggles the visibility of the passed element el.\n    */\n\n    function toggle(el, value) {\n      if (typeof value === \"boolean\") {\n        for (var i = 0; i < el.length; i++) {\n          el[i].style.display = value ? 'block' : 'none';\n        }\n      } //we don't use it in other way, so no else :)\n\n\n      return el;\n    }\n    /**\n    * Creates a HTMLElement from the passed HTML string.\n    * https://stackoverflow.com/a/494348/1081396\n    */\n\n    function createElementFromHTML(htmlString) {\n      var div = doc.createElement('div');\n      div.innerHTML = htmlString.trim(); // Change this to div.childNodes to support multiple top-level nodes\n\n      return div.firstChild;\n    }\n    /**\n    * Removes the passed item/s from the DOM.\n    */\n\n    function remove(items) {\n      items = getList(items);\n\n      for (var i = 0; i < items.length; i++) {\n        var item = items[i];\n\n        if (item && item.parentElement) {\n          item.parentNode.removeChild(item);\n        }\n      }\n    } //https://jsfiddle.net/w1rktecz/\n\n    function untilAll(item, selector, fn) {\n      var sibling = item[fn];\n      var siblings = [];\n\n      while (sibling) {\n        if (matches(sibling, selector) || selector == null) {\n          siblings.push(sibling);\n        }\n\n        sibling = sibling[fn];\n      }\n\n      return siblings;\n    }\n    /**\n    * Gets all next elements matching the passed selector.\n    */\n\n    function nextAll(item, selector) {\n      return untilAll(item, selector, 'nextElementSibling');\n    }\n    /**\n    * Gets all previous elements matching the passed selector.\n    */\n\n    function prevAll(item, selector) {\n      return untilAll(item, selector, 'previousElementSibling');\n    }\n    /**\n    * Converts an object to an array.\n    */\n\n    function toArray(objectData) {\n      return Object.keys(objectData).map(function (key) {\n        return objectData[key];\n      });\n    }\n    function getLast(items) {\n      return items[items.length - 1];\n    }\n    /**\n    * Gets the average of the last `number` elements of the given array.\n    */\n\n    function getAverage(elements, number) {\n      var sum = 0; //taking `number` elements from the end to make the average, if there are not enought, 1\n\n      var lastElements = elements.slice(Math.max(elements.length - number, 1));\n\n      for (var i = 0; i < lastElements.length; i++) {\n        sum = sum + lastElements[i];\n      }\n\n      return Math.ceil(sum / number);\n    }\n    /**\n    * Sets the value for the given attribute from the `data-` attribute with the same suffix\n    * ie: data-srcset ==> srcset  |  data-src ==> src\n    */\n\n    function setSrc(element, attribute) {\n      element.setAttribute(attribute, getAttr(element, 'data-' + attribute));\n      element.removeAttribute('data-' + attribute);\n    }\n    function getParentsUntil(item, topParentSelector) {\n      var parents = [item];\n\n      do {\n        item = item.parentNode;\n        parents.push(item);\n      } while (!matches(item, topParentSelector));\n\n      return parents;\n    }\n    function isInsideInput() {\n      var activeElement = doc.activeElement;\n      return matches(activeElement, 'textarea') || matches(activeElement, 'input') || matches(activeElement, 'select') || getAttr(activeElement, 'contentEditable') == \"true\" || getAttr(activeElement, 'contentEditable') == '';\n    } //utils are public, so we can use it wherever we want\n    // @ts-ignore\n\n    window[\"fp_utils\"] = {\n      \"$\": $,\n      \"deepExtend\": deepExtend,\n      \"hasClass\": hasClass,\n      \"getWindowHeight\": getWindowHeight,\n      \"css\": css,\n      \"prev\": prev,\n      \"next\": next,\n      \"last\": last,\n      \"index\": index,\n      \"getList\": getList,\n      \"hide\": hide,\n      \"show\": show,\n      \"isArrayOrList\": isArrayOrList,\n      \"addClass\": addClass,\n      \"removeClass\": removeClass,\n      \"appendTo\": appendTo,\n      \"wrap\": wrap,\n      \"wrapAll\": wrapAll,\n      \"unwrap\": unwrap,\n      \"closest\": closest,\n      \"after\": after,\n      \"before\": before,\n      \"insertBefore\": insertBefore,\n      \"getScrollTop\": getScrollTop,\n      \"siblings\": siblings,\n      \"preventDefault\": preventDefault,\n      \"isFunction\": isFunction,\n      \"trigger\": trigger,\n      \"matches\": matches,\n      \"toggle\": toggle,\n      \"createElementFromHTML\": createElementFromHTML,\n      \"remove\": remove,\n      // \"filter\": filter,\n      \"untilAll\": untilAll,\n      \"nextAll\": nextAll,\n      \"prevAll\": prevAll,\n      \"showError\": showError\n    };\n\n    var utils = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        showError: showError,\n        isVisible: isVisible,\n        getVisible: getVisible,\n        $: $,\n        deepExtend: deepExtend,\n        hasClass: hasClass,\n        getWindowHeight: getWindowHeight,\n        getWindowWidth: getWindowWidth,\n        css: css,\n        prev: prev,\n        next: next,\n        last: last,\n        index: index,\n        getList: getList,\n        hide: hide,\n        show: show,\n        isArrayOrList: isArrayOrList,\n        addClass: addClass,\n        removeClass: removeClass,\n        appendTo: appendTo,\n        wrap: wrap,\n        wrapAll: wrapAll,\n        wrapInner: wrapInner,\n        unwrap: unwrap,\n        closest: closest,\n        after: after,\n        before: before,\n        insertBefore: insertBefore,\n        getScrollTop: getScrollTop,\n        siblings: siblings,\n        preventDefault: preventDefault,\n        getAttr: getAttr,\n        docAddEvent: docAddEvent,\n        windowAddEvent: windowAddEvent,\n        docRemoveEvent: docRemoveEvent,\n        windowRemoveEvent: windowRemoveEvent,\n        isFunction: isFunction,\n        trigger: trigger,\n        matches: matches,\n        toggle: toggle,\n        createElementFromHTML: createElementFromHTML,\n        remove: remove,\n        untilAll: untilAll,\n        nextAll: nextAll,\n        prevAll: prevAll,\n        toArray: toArray,\n        getLast: getLast,\n        getAverage: getAverage,\n        setSrc: setSrc,\n        getParentsUntil: getParentsUntil,\n        isInsideInput: isInsideInput\n    });\n\n    function _typeof(obj) {\n      \"@babel/helpers - typeof\";\n\n      if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n        _typeof = function (obj) {\n          return typeof obj;\n        };\n      } else {\n        _typeof = function (obj) {\n          return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n        };\n      }\n\n      return _typeof(obj);\n    }\n\n    var EventEmitter = {\n      events: {},\n      on: function on(event, listener) {\n        var _this = this;\n\n        if (_typeof(this.events[event]) !== 'object') {\n          this.events[event] = [];\n        }\n\n        this.events[event].push(listener);\n        return function () {\n          return _this.removeListener(event, listener);\n        };\n      },\n      removeListener: function removeListener(event, listener) {\n        if (_typeof(this.events[event]) === 'object') {\n          var idx = this.events[event].indexOf(listener);\n\n          if (idx > -1) {\n            this.events[event].splice(idx, 1);\n          }\n        }\n      },\n      emit: function emit(event) {\n        var _this2 = this;\n\n        for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n          args[_key - 1] = arguments[_key];\n        }\n\n        if (_typeof(this.events[event]) === 'object') {\n          this.events[event].forEach(function (listener) {\n            return listener.apply(_this2, args);\n          });\n        }\n      },\n      once: function once(event, listener) {\n        var _this3 = this;\n\n        var remove = this.on(event, function () {\n          remove();\n\n          for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n            args[_key2] = arguments[_key2];\n          }\n\n          listener.apply(_this3, args);\n        });\n      }\n    };\n\n    var defaultState = {\n      numSections: 0,\n      numSlides: 0,\n      slides: [],\n      sections: [],\n      activeSection: null,\n      scrollTrigger: null,\n      isBeyondFullpage: false,\n      aboutToScrollToFullPage: false,\n      slideMoving: false,\n      isResizing: false,\n      isScrolling: false,\n      lastScrolledDestiny: undefined,\n      lastScrolledSlide: undefined,\n      activeAnimation: false,\n      canScroll: true,\n      touchDirection: 'none',\n      wheelDirection: 'none',\n      isGrabbing: false,\n      isUsingWheel: false,\n      isWindowFocused: true,\n      previousDestTop: 0,\n      windowsHeight: getWindowHeight(),\n      isDoingContinousVertical: false,\n      timeouts: {},\n      scrollY: 0,\n      scrollX: 0,\n      isFullpageInitDone: false\n    };\n    var state = Object.assign({}, defaultState); // @ts-ignore\n\n    win.state = state;\n    function setState(props) {\n      Object.assign(state, props);\n    }\n    function getState() {\n      return state;\n    }\n    function getActivePanel() {\n      return state.activeSection && state.activeSection.activeSlide ? state.activeSection.activeSlide : state.activeSection;\n    }\n    function resetState() {\n      setState(defaultState);\n    }\n\n    var events = {\n      onAfterRenderNoAnchor: 'onAfterRenderNoAnchor',\n      onClickOrTouch: 'onClickOrTouch',\n      moveSlideLeft: 'moveSlideLeft',\n      moveSlideRight: 'moveSlideRight',\n      onInitialise: 'onInitialise',\n      beforeInit: 'beforeInit',\n      bindEvents: 'bindEvents',\n      onDestroy: 'onDestroy',\n      onDestroyAll: 'onDestroyAll',\n      contentChanged: 'contentChanged',\n      onScrollOverflowScrolled: 'onScrollOverflowScrolled',\n      onScrollPageAndSlide: 'onScrollPageAndSlide',\n      onKeyDown: 'onKeyDown',\n      onMenuClick: 'onMenuClick',\n      scrollPage: 'scrollPage',\n      landscapeScroll: 'landscapeScroll',\n      scrollBeyondFullpage: 'scrollBeyondFullpage',\n      onPerformMovement: 'onPerformMovement',\n      onSlideLeave: 'onSlideLeave',\n      onLeave: 'onLeave',\n      afterSectionLoads: 'afterSectionLoads',\n      afterSlideLoads: 'afterSlideLoads'\n    };\n\n    EventEmitter.on(events.bindEvents, bindEvents$c);\n\n    function bindEvents$c() {\n      //Scrolls to the section when clicking the navigation bullet\n      //simulating the jQuery .on('click') event using delegation\n      ['click', 'touchstart'].forEach(function (eventName) {\n        docAddEvent(eventName, delegatedEvents);\n      });\n      windowAddEvent('focus', focusHandler);\n      internalEvents();\n    }\n\n    function internalEvents() {\n      EventEmitter.on(events.onDestroy, onDestroy$9);\n    }\n\n    function delegatedEvents(e) {\n      EventEmitter.emit(events.onClickOrTouch, {\n        e: e,\n        target: e.target\n      });\n    }\n\n    function onDestroy$9() {\n      ['click', 'touchstart'].forEach(function (eventName) {\n        docRemoveEvent(eventName, delegatedEvents);\n      });\n    } // changing isWindowFocused to true on focus event\n\n\n    function focusHandler() {\n      setState({\n        isWindowFocused: true\n      });\n    }\n\n    // keeping central set of classnames and selectors\n    var WRAPPER = 'fullpage-wrapper';\n    var WRAPPER_SEL = '.' + WRAPPER; // slimscroll\n\n    var SCROLLABLE = 'fp-scrollable';\n\n    var RESPONSIVE = 'fp-responsive';\n    var NO_TRANSITION = 'fp-notransition';\n    var DESTROYED = 'fp-destroyed';\n    var ENABLED = 'fp-enabled';\n    var VIEWING_PREFIX = 'fp-viewing';\n    var ACTIVE = 'active';\n    var ACTIVE_SEL = '.' + ACTIVE;\n    var COMPLETELY = 'fp-completely';\n    var COMPLETELY_SEL = '.' + COMPLETELY;\n    var LOADED = 'fp-loaded';\n\n    var SECTION_DEFAULT_SEL = '.section';\n    var SECTION = 'fp-section';\n    var SECTION_SEL = '.' + SECTION;\n    var SECTION_ACTIVE_SEL = SECTION_SEL + ACTIVE_SEL;\n    var TABLE_CELL = 'fp-tableCell';\n    var TABLE_CELL_SEL = '.' + TABLE_CELL;\n    var AUTO_HEIGHT = 'fp-auto-height';\n    var AUTO_HEIGHT_SEL = '.' + AUTO_HEIGHT;\n    var AUTO_HEIGHT_RESPONSIVE = 'fp-auto-height-responsive';\n    var AUTO_HEIGHT_RESPONSIVE_SEL = '.' + AUTO_HEIGHT_RESPONSIVE;\n    var NORMAL_SCROLL = 'fp-normal-scroll';\n\n    var SECTION_NAV = 'fp-nav';\n    var SECTION_NAV_SEL = '#' + SECTION_NAV;\n    var SECTION_NAV_TOOLTIP = 'fp-tooltip';\n    var SECTION_NAV_TOOLTIP_SEL = '.' + SECTION_NAV_TOOLTIP;\n    var SHOW_ACTIVE_TOOLTIP = 'fp-show-active'; // slide\n\n    var SLIDE_DEFAULT_SEL = '.slide';\n    var SLIDE = 'fp-slide';\n    var SLIDE_SEL = '.' + SLIDE;\n    var SLIDE_ACTIVE_SEL = SLIDE_SEL + ACTIVE_SEL;\n    var SLIDES_WRAPPER = 'fp-slides';\n    var SLIDES_WRAPPER_SEL = '.' + SLIDES_WRAPPER;\n    var SLIDES_CONTAINER = 'fp-slidesContainer';\n    var SLIDES_CONTAINER_SEL = '.' + SLIDES_CONTAINER;\n    var TABLE = 'fp-table';\n    var OVERFLOW = 'fp-overflow';\n    var OVERFLOW_SEL = '.' + OVERFLOW;\n    var IS_OVERFLOW = 'fp-is-overflow'; // slide nav\n\n    var SLIDES_NAV = 'fp-slidesNav';\n    var SLIDES_NAV_SEL = '.' + SLIDES_NAV;\n    var SLIDES_NAV_LINK_SEL = SLIDES_NAV_SEL + ' a';\n    var SLIDES_STYLED_ARROW = 'fp-arrow';\n    var SLIDES_ARROW = 'fp-controlArrow';\n    var SLIDES_ARROW_SEL = '.' + SLIDES_ARROW;\n    var SLIDES_PREV = 'fp-prev';\n    var SLIDES_PREV_SEL = '.' + SLIDES_PREV;\n    var SLIDES_ARROW_PREV_SEL = SLIDES_ARROW_SEL + SLIDES_PREV_SEL;\n    var SLIDES_NEXT = 'fp-next';\n    var SLIDES_NEXT_SEL = '.' + SLIDES_NEXT;\n    var SLIDES_ARROW_NEXT_SEL = SLIDES_ARROW_SEL + SLIDES_NEXT_SEL; // Watermark\n\n    var WATERMARK = 'fp-watermark';\n    var WATERMARK_SEL = '.' + WATERMARK;\n\n    var defaultOptions = {\n      //navigation\n      menu: false,\n      anchors: [],\n      lockAnchors: false,\n      navigation: false,\n      navigationPosition: 'right',\n      navigationTooltips: [],\n      showActiveTooltip: false,\n      slidesNavigation: false,\n      slidesNavPosition: 'bottom',\n      scrollBar: false,\n      hybrid: false,\n      licenseKey: '',\n      credits: {\n        \"enabled\": true,\n        \"label\": 'Made with fullPage.js',\n        \"position\": 'right'\n      },\n      //scrolling\n      css3: true,\n      scrollingSpeed: 700,\n      autoScrolling: true,\n      fitToSection: true,\n      fitToSectionDelay: 600,\n      easing: 'easeInOutCubic',\n      easingcss3: 'ease',\n      loopBottom: false,\n      loopTop: false,\n      loopHorizontal: true,\n      continuousVertical: false,\n      continuousHorizontal: false,\n      scrollHorizontally: false,\n      interlockedSlides: false,\n      dragAndMove: false,\n      offsetSections: false,\n      resetSliders: false,\n      fadingEffect: false,\n      normalScrollElements: null,\n      scrollOverflow: true,\n      scrollOverflowReset: false,\n      skipIntermediateItems: false,\n      touchSensitivity: 5,\n      touchWrapper: null,\n      bigSectionsDestination: null,\n      adjustOnNavChange: true,\n      //Accessibility\n      keyboardScrolling: true,\n      animateAnchor: true,\n      recordHistory: true,\n      allowCorrectDirection: false,\n      //design\n      scrollOverflowMacStyle: true,\n      controlArrows: true,\n      controlArrowsHTML: ['<div class=\"' + SLIDES_STYLED_ARROW + '\"></div>', '<div class=\"' + SLIDES_STYLED_ARROW + '\"></div>'],\n      controlArrowColor: '#fff',\n      verticalCentered: true,\n      sectionsColor: [],\n      paddingTop: 0,\n      paddingBottom: 0,\n      fixedElements: null,\n      responsive: 0,\n      //backwards compabitility with responsiveWiddth\n      responsiveWidth: 0,\n      responsiveHeight: 0,\n      responsiveSlides: false,\n      parallax: false,\n      parallaxOptions: {\n        type: 'reveal',\n        percentage: 62,\n        property: 'translate'\n      },\n      cards: false,\n      cardsOptions: {\n        perspective: 100,\n        fadeContent: true,\n        fadeBackground: true\n      },\n      //Custom selectors\n      sectionSelector: SECTION_DEFAULT_SEL,\n      slideSelector: SLIDE_DEFAULT_SEL,\n      //events\n      afterLoad: null,\n      beforeLeave: null,\n      onLeave: null,\n      afterRender: null,\n      afterResize: null,\n      afterReBuild: null,\n      afterSlideLoad: null,\n      onSlideLeave: null,\n      afterResponsive: null,\n      onScrollOverflow: null,\n      lazyLoading: true,\n      lazyLoadThreshold: 0,\n      observer: true,\n      scrollBeyondFullpage: true,\n      rtl: false\n    };\n\n    var container = null;\n    var g_initialAnchorsInDom = false;\n    var originals = deepExtend({}, defaultOptions); //deep copy\n\n    var g_options = null;\n    function getInitialAnchorsInDom() {\n      return g_initialAnchorsInDom;\n    }\n    function setContainer(value) {\n      container = value;\n    }\n    function getContainer(value) {\n      return container;\n    }\n    function getOptions() {\n      return g_options || defaultOptions;\n    }\n    function setOptions(options) {\n      g_options = deepExtend({}, defaultOptions, options);\n      originals = Object.assign({}, g_options);\n    }\n    function getOriginals() {\n      return originals;\n    }\n    function setOption(name, value) {\n      defaultOptions[name] = value;\n    }\n    /*\n    * Sets the state for a variable with multiple states (original, and temporal)\n    * Some variables such as `autoScrolling` or `recordHistory` might change automatically its state when using `responsive` or `autoScrolling:false`.\n    * This function is used to keep track of both states, the original and the temporal one.\n    * If type is not 'internal', then we assume the user is globally changing the variable.\n    */\n\n    function setVariableState(variable, value, type) {\n      g_options[variable] = value;\n\n      if (type !== 'internal') {\n        originals[variable] = value;\n      }\n    }\n    /**\n    * Setting options from DOM elements if they are not provided.\n    */\n\n    function setOptionsFromDOM() {\n      //no anchors option? Checking for them in the DOM attributes\n      if (!getOptions().anchors.length) {\n        var anchorsAttribute = '[data-anchor]';\n        var anchors = $(getOptions().sectionSelector.split(',').join(anchorsAttribute + ',') + anchorsAttribute, container);\n\n        if (anchors.length && anchors.length === $(getOptions().sectionSelector, container).length) {\n          g_initialAnchorsInDom = true;\n          anchors.forEach(function (item) {\n            getOptions().anchors.push(getAttr(item, 'data-anchor').toString());\n          });\n        }\n      } //no tooltips option? Checking for them in the DOM attributes\n\n\n      if (!getOptions().navigationTooltips.length) {\n        var tooltipsAttribute = '[data-tooltip]';\n        var tooltips = $(getOptions().sectionSelector.split(',').join(tooltipsAttribute + ',') + tooltipsAttribute, container);\n\n        if (tooltips.length) {\n          tooltips.forEach(function (item) {\n            getOptions().navigationTooltips.push(getAttr(item, 'data-tooltip').toString());\n          });\n        }\n      }\n    }\n\n    var plainItem = function plainItem(panel) {\n      this.anchor = panel.anchor;\n      this.item = panel.item;\n      this.index = panel.index();\n      this.isLast = this.index === panel.item.parentElement.querySelectorAll(panel.selector).length - 1;\n      this.isFirst = !this.index;\n      this.isActive = panel.isActive;\n    };\n    /**\n    * Item. Slide or Section objects share the same properties.\n    */\n\n    var Item = function Item(el, selector) {\n      this.parent = this.parent || null;\n      this.selector = selector;\n      this.anchor = getAttr(el, 'data-anchor') || getOptions().anchors[index(el, getOptions().sectionSelector)];\n      this.item = el;\n      this.isVisible = isVisible(el);\n      this.isActive = hasClass(el, ACTIVE);\n      this.hasScroll = hasClass(el, OVERFLOW) || $(OVERFLOW_SEL, el)[0] != null;\n      this.isSection = selector === getOptions().sectionSelector;\n      this.container = closest(el, SLIDES_CONTAINER_SEL) || closest(el, WRAPPER_SEL);\n\n      this.index = function () {\n        return this.siblings().indexOf(this);\n      };\n    };\n\n    Item.prototype.siblings = function () {\n      if (this.isSection) {\n        if (this.isVisible) {\n          return state.sections;\n        } else {\n          return state.sectionsIncludingHidden;\n        }\n      }\n\n      return this.parent ? this.parent.slides : 0;\n    };\n\n    Item.prototype.prev = function () {\n      var siblings = this.siblings();\n      var currentIndex = this.isSection ? siblings.indexOf(this) : this.parent.slides.indexOf(this);\n      var prevIndex = currentIndex - 1;\n\n      if (prevIndex >= 0) {\n        return siblings[prevIndex];\n      }\n\n      return null;\n    };\n\n    Item.prototype.next = function () {\n      var siblings = this.siblings();\n      var currentIndex = this.isSection ? siblings.indexOf(this) : this.parent.slides.indexOf(this);\n      var nextIndex = currentIndex + 1;\n\n      if (nextIndex < siblings.length) {\n        return siblings[nextIndex];\n      }\n\n      return null;\n    };\n\n    Item.prototype[\"prevPanel\"] = function () {\n      return this.prev() || (this.parent ? this.parent.prev() : null);\n    };\n\n    Item.prototype[\"nextPanel\"] = function () {\n      return this.next() || (this.parent ? this.parent.next() : null);\n    };\n\n    Item.prototype.getSiblings = function () {\n      if (this.isSection) {\n        return state.sections;\n      }\n\n      return state.panels;\n    };\n\n    function getNodes(panels) {\n      return panels.map(function (panel) {\n        return panel.item;\n      });\n    }\n    function getPanelByElement(panels, el) {\n      return panels.find(function (panel) {\n        return panel.item === el;\n      });\n    }\n    var Section = function Section(el) {\n      plainItem.call(this, el);\n    };\n    var Slide = function Slide(el) {\n      plainItem.call(this, el);\n    };\n\n    /**\n    * Gets the active slide (or section) for the given section\n    */\n\n    function getSlideOrSection(destiny) {\n      var slide = $(SLIDE_ACTIVE_SEL, destiny);\n\n      if (slide.length) {\n        destiny = slide[0];\n      }\n\n      return destiny;\n    }\n    function getSlideOrSectionPanel(panel) {\n      if (!panel) {\n        return null;\n      }\n\n      return panel.activeSlide ? panel.activeSlide : panel;\n    }\n    function isFullPageAbove() {\n      return getContainer().getBoundingClientRect().bottom >= 0;\n    }\n    /**\n    * Gets the scrolling settings depending on the plugin autoScrolling option\n    */\n\n    function getScrollSettings(top) {\n      var options = getOptions();\n      var position;\n      var element; //top property animation\n\n      if (options.autoScrolling && !options.scrollBar) {\n        position = -top;\n        element = $(WRAPPER_SEL)[0];\n      } //window real scrolling\n      else {\n        position = top;\n        element = window;\n      }\n\n      return {\n        options: position,\n        element: element\n      };\n    }\n    /**\n    * Scrolls the page / slider the given number of pixels.\n    * It will do it one or another way dependiong on the library's config.\n    */\n\n    function setScrolling(element, val) {\n      if (!getOptions().autoScrolling || getOptions().scrollBar || element.self != window && hasClass(element, SLIDES_WRAPPER)) {\n        //scrolling horizontally through the slides?\n        if (element.self != window && hasClass(element, SLIDES_WRAPPER)) {\n          element.scrollLeft = val;\n        } //vertical scroll\n        else {\n          element.scrollTo(0, val);\n        }\n      } else {\n        element.style.top = val + 'px';\n      }\n    }\n    /**\n    * Adds transition animations for the given element\n    */\n\n    function addAnimation(element) {\n      var transition = 'transform ' + getOptions().scrollingSpeed + 'ms ' + getOptions().easingcss3;\n      removeClass(element, NO_TRANSITION);\n      return css(element, {\n        '-webkit-transition': transition,\n        'transition': transition\n      });\n    }\n    /**\n    * Retuns `up` or `down` depending on the scrolling movement to reach its destination\n    * from the current section.\n    */\n\n    function getYmovement(activeSection, destiny) {\n      var fromIndex = activeSection.index();\n      var toIndex = index(destiny, SECTION_SEL);\n\n      if (fromIndex == toIndex) {\n        return 'none';\n      }\n\n      if (fromIndex > toIndex) {\n        return 'up';\n      }\n\n      return 'down';\n    }\n    /**\n    * Remove transition animations for the given element\n    */\n\n    function removeAnimation(element) {\n      return addClass(element, NO_TRANSITION);\n    }\n    /**\n    * Returns the cross-browser transform string.\n    */\n\n    function getTransforms(translate3d) {\n      return {\n        '-webkit-transform': translate3d,\n        '-moz-transform': translate3d,\n        '-ms-transform': translate3d,\n        'transform': translate3d\n      };\n    }\n\n    var silentScrollId;\n    /**\n    * Adds a css3 transform property to the container class with or without animation depending on the animated param.\n    */\n\n    function transformContainer(translate3d, animated) {\n      if (animated) {\n        addAnimation(getContainer());\n      } else {\n        removeAnimation(getContainer());\n      }\n\n      clearTimeout(silentScrollId);\n      css(getContainer(), getTransforms(translate3d));\n      FP.test.translate3d = translate3d; //syncronously removing the class after the animation has been applied.\n\n      silentScrollId = setTimeout(function () {\n        removeClass(getContainer(), NO_TRANSITION);\n      }, 10);\n    }\n\n    /**\n    * Scrolls silently (with no animation) the page to the given Y position.\n    */\n\n    function silentScroll(top) {\n      // The first section can have a negative value in iOS 10. Not quite sure why: -0.0142822265625\n      // that's why we round it to 0.\n      var roundedTop = Math.round(top);\n\n      if (getOptions().css3 && getOptions().autoScrolling && !getOptions().scrollBar) {\n        var translate3d = 'translate3d(0px, -' + roundedTop + 'px, 0px)';\n        transformContainer(translate3d, false);\n      } else if (getOptions().autoScrolling && !getOptions().scrollBar) {\n        css(getContainer(), {\n          'top': -roundedTop + 'px'\n        });\n        FP.test.top = -roundedTop + 'px';\n      } else {\n        var scrollSettings = getScrollSettings(roundedTop);\n        setScrolling(scrollSettings.element, scrollSettings.options);\n      }\n    }\n\n    FP.setScrollingSpeed = setScrollingSpeed;\n    /**\n    * Defines the scrolling speed\n    */\n\n    function setScrollingSpeed(value, type) {\n      setVariableState('scrollingSpeed', value, type);\n    }\n\n    var $body = null;\n    var $html = null;\n    var $htmlBody = null; // caching common elements\n\n    function setCache() {\n      $body = $('body')[0];\n      $html = $('html')[0];\n      $htmlBody = $('html, body');\n    }\n\n    //@ts-check\n\n    var _g_animateScroll;\n    /**\n    * Simulates the animated scrollTop of jQuery. Used when css3:false or scrollBar:true or autoScrolling:false\n    * http://stackoverflow.com/a/16136789/1081396\n    */\n\n\n    function scrollTo(element, to, duration, callback) {\n      var start = getScrolledPosition(element);\n      var change = to - start;\n      var isCallbackFired = false;\n      var startTime;\n      var wasAnimationActive = state.activeAnimation;\n      setState({\n        activeAnimation: true\n      }); // Cancelling any possible previous animations (io: clicking on nav dots very fast)\n\n      if (_g_animateScroll) {\n        window.cancelAnimationFrame(_g_animateScroll);\n      }\n\n      _g_animateScroll = function g_animateScroll(timestamp) {\n        if (!startTime) {\n          startTime = timestamp;\n        }\n\n        var currentTime = Math.floor(timestamp - startTime);\n\n        if (state.activeAnimation) {\n          //in order to stope it from other function whenever we want\n          var val = to;\n\n          if (duration) {\n            // @ts-ignore\n            val = win.fp_easings[getOptions().easing](currentTime, start, change, duration);\n          }\n\n          if (currentTime <= duration) {\n            setScrolling(element, val);\n          }\n\n          if (currentTime < duration) {\n            window.requestAnimationFrame(_g_animateScroll);\n          } else if (typeof callback !== 'undefined' && !isCallbackFired) {\n            setScrolling(element, to);\n            callback();\n            setState({\n              activeAnimation: false\n            });\n            isCallbackFired = true;\n          }\n        } else if (!isCallbackFired && !wasAnimationActive) {\n          callback();\n          setState({\n            activeAnimation: false\n          });\n          isCallbackFired = true;\n        }\n      };\n\n      window.requestAnimationFrame(_g_animateScroll);\n    }\n    /**\n    * Getting the position of the element to scroll when using jQuery animations\n    */\n\n    function getScrolledPosition(element) {\n      var position; //is not the window element and is a slide?\n\n      if (element.self != win && hasClass(element, SLIDES_WRAPPER)) {\n        position = element.scrollLeft;\n      } else if (!getOptions().autoScrolling || getOptions().scrollBar) {\n        position = getScrollTop();\n      } else {\n        position = element.offsetTop;\n      } //gets the top property of the wrapper\n\n\n      return position;\n    }\n\n    /**\n    * Makes sure to only create a Panel object if the element exist\n    */\n\n    function nullOrSection(el) {\n      if (el && !el.item) {\n        return new Section(new SectionPanel(el));\n      }\n\n      return el ? new Section(el) : null;\n    }\n\n    function nullOrSlide(el) {\n      return el ? new Slide(el) : null;\n    }\n\n    /**\n    * Dispatch events & callbacks\n    */\n\n    function fireCallback(eventName, v) {\n      var eventData = getEventData(eventName, v);\n      trigger(getContainer(), eventName, eventData);\n\n      if (getOptions()[eventName].apply(eventData[Object.keys(eventData)[0]], toArray(eventData)) === false) {\n        return false;\n      }\n\n      return true;\n    }\n    /**\n    * Gets the event's data for the given event on the right format.\n    */\n\n    function getEventData(eventName, v) {\n      //using functions to run only the necessary bits within the object\n      var paramsPerEvent = {\n        afterRender: function afterRender() {\n          return {\n            section: nullOrSection(getState().activeSection),\n            slide: nullOrSlide(getState().activeSection.activeSlide)\n          };\n        },\n        onLeave: function onLeave() {\n          return {\n            origin: nullOrSection(v.items.origin),\n            destination: nullOrSection(v.items.destination),\n            direction: v.direction,\n            trigger: getState().scrollTrigger\n          };\n        },\n        afterLoad: function afterLoad() {\n          return paramsPerEvent.onLeave();\n        },\n        afterSlideLoad: function afterSlideLoad() {\n          return {\n            section: nullOrSection(v.items.section),\n            origin: nullOrSection(v.items.origin),\n            destination: nullOrSection(v.items.destination),\n            direction: v.direction,\n            trigger: getState().scrollTrigger\n          };\n        },\n        onSlideLeave: function onSlideLeave() {\n          return paramsPerEvent.afterSlideLoad();\n        },\n        beforeLeave: function beforeLeave() {\n          return paramsPerEvent.onLeave();\n        },\n        onScrollOverflow: function onScrollOverflow() {\n          return {\n            section: nullOrSection(getState().activeSection),\n            slide: nullOrSlide(getState().activeSection.activeSlide),\n            position: v.position,\n            direction: v.direction\n          };\n        }\n      };\n      return paramsPerEvent[eventName]();\n    }\n\n    function hasAutoPlay(item) {\n      return item.hasAttribute('data-autoplay') || item.hasAttribute('autoplay');\n    }\n    /**\n    * Plays video and audio elements.\n    */\n\n\n    function playMedia(destiny) {\n      var panel = getSlideOrSection(destiny); //playing HTML5 media elements\n\n      $('video, audio', panel).forEach(function (element) {\n        if (hasAutoPlay(element) && typeof element.play === 'function') {\n          element.play();\n        }\n      }); //youtube videos\n\n      $('iframe[src*=\"youtube.com/embed/\"]', panel).forEach(function (element) {\n        if (hasAutoPlay(element)) {\n          playYoutube(element);\n        } //in case the URL was not loaded yet. On page load we need time for the new URL (with the API string) to load.\n\n\n        element.onload = function () {\n          if (hasAutoPlay(element)) {\n            playYoutube(element);\n          }\n        };\n      });\n    }\n    /**\n    * Plays a youtube video\n    */\n\n    function playYoutube(element) {\n      element.contentWindow.postMessage('{\"event\":\"command\",\"func\":\"playVideo\",\"args\":\"\"}', '*');\n    }\n    /**\n    * Stops video and audio elements.\n    */\n\n\n    function stopMedia(destiny) {\n      var panel = getSlideOrSection(destiny); //stopping HTML5 media elements\n\n      $('video, audio', panel).forEach(function (element) {\n        if (!element.hasAttribute('data-keepplaying') && typeof element.pause === 'function') {\n          element.pause();\n        }\n      }); //youtube videos\n\n      $('iframe[src*=\"youtube.com/embed/\"]', panel).forEach(function (element) {\n        if (/youtube\\.com\\/embed\\//.test(getAttr(element, 'src')) && !element.hasAttribute('data-keepplaying')) {\n          element.contentWindow.postMessage('{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*');\n        }\n      });\n    }\n    /*\n    * Enables the Youtube videos API so we can control their flow if necessary.\n    */\n\n    function enableYoutubeAPI() {\n      $('iframe[src*=\"youtube.com/embed/\"]', getContainer()).forEach(function (item) {\n        addURLParam(item, 'enablejsapi=1');\n      });\n    }\n    /**\n    * Adds a new parameter and its value to the `src` of a given element\n    */\n\n    function addURLParam(element, newParam) {\n      var originalSrc = getAttr(element, 'src');\n      element.setAttribute('src', originalSrc + getUrlParamSign(originalSrc) + newParam);\n    }\n    /*\n    * Returns the prefix sign to use for a new parameter in an existen URL.\n    *\n    * @return {String}  ? | &\n    */\n\n\n    function getUrlParamSign(url) {\n      return !/\\?/.test(url) ? '?' : '&';\n    }\n\n    /**\n    * Lazy loads image, video and audio elements.\n    */\n\n    function lazyLoad(destiny) {\n      if (!getOptions().lazyLoading) {\n        return;\n      }\n\n      var panel = getSlideOrSection(destiny);\n      $('img[data-src], img[data-srcset], source[data-src], source[data-srcset], video[data-src], audio[data-src], iframe[data-src]', panel).forEach(function (element) {\n        ['src', 'srcset'].forEach(function (type) {\n          var attribute = getAttr(element, 'data-' + type);\n\n          if (attribute != null && attribute) {\n            setSrc(element, type);\n            element.addEventListener('load', function () {\n            });\n          }\n        });\n\n        if (matches(element, 'source')) {\n          var elementToPlay = closest(element, 'video, audio');\n\n          if (elementToPlay) {\n            elementToPlay.load();\n\n            elementToPlay.onloadeddata = function () {\n            };\n          }\n        }\n      }); // Add fp-loaded class to the panel after lazy loading\n\n      addClass(panel, LOADED);\n    }\n    function lazyLoadPanels(panel) {\n      var lazyLoadThresold = getOptions().lazyLoadThreshold;\n      lazyLoad(panel.item);\n\n      if (lazyLoadThresold) {\n        lazyLoadDirection(panel, 'prev', lazyLoadThresold);\n        lazyLoadDirection(panel, 'next', lazyLoadThresold);\n      }\n    } // Lazy load \"count\" number of panels in a specific direction\n\n    function lazyLoadDirection(startPanel, direction, count) {\n      var currentPanel = startPanel;\n\n      for (var i = 0; i < count && (currentPanel = currentPanel[direction]()); i++) {\n        lazyLoad(currentPanel.item);\n      }\n    }\n\n    /**\n    * Sets a class for the body of the page depending on the active section / slide\n    */\n\n    function setBodyClass() {\n      var section = getState().activeSection.item;\n      var slide = getState().activeSection.activeSlide;\n      var sectionAnchor = getAnchor(section);\n      var text = String(sectionAnchor);\n\n      if (slide) {\n        var slideAnchor = getAnchor(slide.item);\n        text = text + '-' + slideAnchor;\n      } //changing slash for dash to make it a valid CSS style\n\n\n      text = text.replace('/', '-').replace('#', '').replace(/\\s/g, ''); //removing previous anchor classes\n\n      var classRe = new RegExp('\\\\b\\\\s?' + VIEWING_PREFIX + '-[^\\\\s]+\\\\b', \"g\");\n      $body.className = $body.className.replace(classRe, ''); //adding the current anchor\n\n      addClass($body, VIEWING_PREFIX + '-' + text);\n    }\n    /**\n    * Gets the anchor for the given slide / section. Its index will be used if there's none.\n    */\n\n    function getAnchor(element) {\n      if (!element) {\n        return null;\n      }\n\n      var anchor = getAttr(element, 'data-anchor');\n      var elementIndex = index(element); //Slide without anchor link? We take the index instead.\n\n      if (anchor == null) {\n        anchor = elementIndex;\n      }\n\n      return anchor;\n    }\n\n    EventEmitter.on(events.onDestroyAll, onDestroyAll$1);\n\n    function onDestroyAll$1() {\n      // removing hash + # symbol from the URL\n      win.history.replaceState(null, '', win.location.pathname + window.location.search);\n    }\n    /**\n    * Sets the state of the website depending on the active section/slide.\n    * It changes the URL hash when needed and updates the body class.\n    */\n\n\n    function setPageStatus(slideIndex, slideAnchor, anchorLink) {\n      var sectionHash = '';\n\n      if (getOptions().anchors.length && !getOptions().lockAnchors) {\n        //isn't it the first slide?\n        if (slideIndex) {\n          if (anchorLink != null) {\n            sectionHash = anchorLink;\n          } //slide without anchor link? We take the index instead.\n\n\n          if (slideAnchor == null) {\n            slideAnchor = slideIndex;\n          }\n\n          setState({\n            lastScrolledSlide: slideAnchor\n          });\n          setUrlHash(sectionHash + '/' + slideAnchor); //first slide won't have slide anchor, just the section one\n        } else if (slideIndex != null) {\n          setState({\n            lastScrolledSlide: slideAnchor\n          });\n          setUrlHash(anchorLink);\n        } //section without slides\n        else {\n          setUrlHash(anchorLink);\n        }\n      }\n\n      setBodyClass();\n    }\n    /**\n    * Sets the URL hash.\n    */\n\n    function setUrlHash(url) {\n      if (getOptions().recordHistory) {\n        location.hash = url;\n      } else {\n        win.history.replaceState(undefined, undefined, '#' + url);\n      }\n    }\n\n    /**\n    * Gets the name for screen readers for a section/slide navigation bullet.\n    */\n\n    function getBulletLinkName(i, defaultName, item) {\n      var anchor = defaultName === 'Section' ? getOptions().anchors[i] : getAttr(item, 'data-anchor');\n      return encodeURI(getOptions().navigationTooltips[i] || anchor || defaultName + ' ' + (i + 1));\n    }\n\n    function slideBulletHandler(e) {\n      // not all events are cancellable \n      // https://www.uriports.com/blog/easy-fix-for-intervention-ignored-attempt-to-cancel-a-touchmove-event-with-cancelable-false/\n      if (e.cancelable) {\n        preventDefault(e);\n      }\n\n      setState({\n        scrollTrigger: 'horizontalNav'\n      });\n      /*jshint validthis:true */\n\n      var sectionElem = closest(this, SECTION_SEL);\n      var slides = $(SLIDES_WRAPPER_SEL, closest(this, SECTION_SEL))[0];\n      var section = getPanelByElement(getState().sections, sectionElem);\n      var destiny = section.slides[index(closest(this, 'li'))];\n      EventEmitter.emit(events.landscapeScroll, {\n        slides: slides,\n        destination: destiny.item\n      });\n    }\n    /**\n    * Sets the state for the horizontal bullet navigations.\n    */\n\n    function activeSlidesNavigation(slidesNav, slideIndex) {\n      if (getOptions().slidesNavigation && slidesNav != null) {\n        removeClass($(ACTIVE_SEL, slidesNav), ACTIVE);\n        addClass($('a', $('li', slidesNav)[slideIndex]), ACTIVE);\n      }\n    }\n    /**\n    * Creates a landscape navigation bar with dots for horizontal sliders.\n    */\n\n    function addSlidesNavigation(section) {\n      var sectionElem = section.item;\n      var numSlides = section.slides.length;\n      appendTo(createElementFromHTML('<div class=\"' + SLIDES_NAV + '\"><ul></ul></div>'), sectionElem);\n      var nav = $(SLIDES_NAV_SEL, sectionElem)[0]; //top or bottom\n\n      addClass(nav, 'fp-' + getOptions().slidesNavPosition);\n\n      for (var i = 0; i < numSlides; i++) {\n        var slide = $(SLIDE_SEL, sectionElem)[i];\n        appendTo(createElementFromHTML('<li><a href=\"#\"><span class=\"fp-sr-only\">' + getBulletLinkName(i, 'Slide', slide) + '</span><span></span></a></li>'), $('ul', nav)[0]);\n      } //centering it\n\n\n      css(nav, {\n        'margin-left': '-' + nav.innerWidth / 2 + 'px'\n      });\n      var activeSlideIndex = section.activeSlide ? section.activeSlide.index() : 0;\n      addClass($('a', $('li', nav)[activeSlideIndex]), ACTIVE);\n    }\n\n    var isScrollAllowed = {};\n    isScrollAllowed.m = {\n      'up': true,\n      'down': true,\n      'left': true,\n      'right': true\n    };\n    isScrollAllowed.k = deepExtend({}, isScrollAllowed.m);\n    /**\n    * Allowing or disallowing the mouse/swipe scroll in a given direction. (not for keyboard)\n    * @param type m (mouse) or k (keyboard)\n    */\n\n    function setIsScrollAllowed(value, direction, type) {\n      //up, down, left, right\n      if (direction !== 'all') {\n        isScrollAllowed[type][direction] = value;\n      } //all directions?\n      else {\n        Object.keys(isScrollAllowed[type]).forEach(function (key) {\n          isScrollAllowed[type][key] = value;\n        });\n      }\n    }\n    function getIsScrollAllowed() {\n      return isScrollAllowed;\n    }\n\n    EventEmitter.on(events.onClickOrTouch, onClickOrTouch$2);\n\n    function onClickOrTouch$2(params) {\n      var target = params.target;\n\n      if (matches(target, SLIDES_ARROW_SEL) || closest(target, SLIDES_ARROW_SEL)) {\n        slideArrowHandler.call(target, params);\n      }\n    } //Scrolling horizontally when clicking on the slider controls.\n\n\n    function slideArrowHandler() {\n      /*jshint validthis:true */\n      var section = closest(this, SECTION_SEL);\n      var isPrevArrow = hasClass(this, SLIDES_PREV) || closest(this, SLIDES_PREV_SEL);\n      /*jshint validthis:true */\n\n      if (isPrevArrow) {\n        if (getIsScrollAllowed().m.left) {\n          setState({\n            scrollTrigger: 'slideArrow'\n          });\n          EventEmitter.emit(events.moveSlideLeft, {\n            section: section\n          });\n        }\n      } else {\n        if (getIsScrollAllowed().m.right) {\n          setState({\n            scrollTrigger: 'slideArrow'\n          });\n          EventEmitter.emit(events.moveSlideRight, {\n            section: section\n          });\n        }\n      }\n    }\n    /**\n    * Creates the control arrows for the given section\n    */\n\n\n    function createSlideArrows(section) {\n      var sectionElem = section.item;\n      var arrows = [createElementFromHTML(getOptions().controlArrowsHTML[0]), createElementFromHTML(getOptions().controlArrowsHTML[1])];\n      after($(SLIDES_WRAPPER_SEL, sectionElem)[0], arrows);\n      addClass(arrows, SLIDES_ARROW);\n      addClass(arrows[0], SLIDES_PREV);\n      addClass(arrows[1], SLIDES_NEXT);\n\n      if (getOptions().controlArrowColor !== '#fff') {\n        css($(SLIDES_ARROW_NEXT_SEL, sectionElem), {\n          'border-color': 'transparent transparent transparent ' + getOptions().controlArrowColor\n        });\n        css($(SLIDES_ARROW_PREV_SEL, sectionElem), {\n          'border-color': 'transparent ' + getOptions().controlArrowColor + ' transparent transparent'\n        });\n      }\n\n      if (!getOptions().loopHorizontal) {\n        hide($(SLIDES_ARROW_PREV_SEL, sectionElem));\n      }\n    }\n    function toggleControlArrows(v) {\n      if (!getOptions().loopHorizontal && getOptions().controlArrows) {\n        //hidding it for the fist slide, showing for the rest\n        toggle($(SLIDES_ARROW_PREV_SEL, v.section), v.slideIndex !== 0); //hidding it for the last slide, showing for the rest\n\n        toggle($(SLIDES_ARROW_NEXT_SEL, v.section), next(v.destiny) != null);\n      }\n    }\n\n    FP.setRecordHistory = setRecordHistory;\n    /**\n    * Defines wheter to record the history for each hash change in the URL.\n    */\n\n    function setRecordHistory(value, type) {\n      setVariableState('recordHistory', value, type);\n    }\n\n    FP.setAutoScrolling = setAutoScrolling;\n    FP.test.setAutoScrolling = setAutoScrolling;\n    /**\n    * Sets the autoScroll option.\n    * It changes the scroll bar visibility and the history of the site as a result.\n    */\n\n    function setAutoScrolling(value, type) {\n      //removing the transformation\n      if (!value) {\n        silentScroll(0);\n      }\n\n      setVariableState('autoScrolling', value, type);\n      var element = getState().activeSection.item;\n\n      if (getOptions().autoScrolling && !getOptions().scrollBar) {\n        css($htmlBody, {\n          'overflow': 'hidden',\n          'height': '100%'\n        });\n        removeClass($body, SCROLLABLE);\n        setRecordHistory(getOriginals().recordHistory, 'internal'); //for IE touch devices\n\n        css(getContainer(), {\n          '-ms-touch-action': 'none',\n          'touch-action': 'none'\n        });\n\n        if (element != null) {\n          //moving the container up\n          silentScroll(element.offsetTop);\n        }\n      } else {\n        css($htmlBody, {\n          'overflow': 'visible',\n          'height': 'initial'\n        });\n        addClass($body, SCROLLABLE);\n        var recordHistory = !getOptions().autoScrolling ? false : getOriginals().recordHistory;\n        setRecordHistory(recordHistory, 'internal'); //for IE touch devices\n\n        css(getContainer(), {\n          '-ms-touch-action': '',\n          'touch-action': ''\n        }); //scrolling the page to the section with no animation\n\n        if (element != null) {\n          var scrollSettings = getScrollSettings(element.offsetTop);\n          scrollSettings.element.scrollTo(0, scrollSettings.options);\n        }\n      }\n    }\n\n    function getTmpPosition(v) {\n      return hasClass(getState().activeSection.item, AUTO_HEIGHT) ? getDestinationPosition(getState().activeSection.item) : getState().activeSection.item.offsetTop;\n    }\n    function getDestinationPosForInfiniteScroll(v) {\n      // forcing the scroll to the bottom of the fp-auto-height section when scrolling up\n      if (v.isMovementUp && hasClass(v.element, AUTO_HEIGHT)) {\n        return getDestinationPosition(v.element) - getWindowHeight() + v.element.offsetHeight;\n      }\n\n      return v.element.offsetTop;\n    }\n\n    //@ts-check\n    /**\n    * Adds sections before or after the current one to create the infinite effect.\n    */\n\n    function createInfiniteSections(v) {\n      setState({\n        isDoingContinousVertical: true\n      });\n      var activeSectionItem = getState().activeSection.item; // Scrolling down\n\n      if (!v.isMovementUp) {\n        // Move all previous sections to after the active section\n        var prevSectionsReversed = prevAll(activeSectionItem, SECTION_SEL).reverse();\n        after(activeSectionItem, prevSectionsReversed[0]);\n      } else {\n        // Scrolling up\n        // Move all next sections to before the active section\n        before(activeSectionItem, nextAll(activeSectionItem, SECTION_SEL));\n      } // Maintain the displayed position (now that we changed the element order)\n\n\n      silentScroll(getTmpPosition()); // Maintain the active slides visible in the viewport\n\n      keepSlidesPosition$1(); // save for later the elements that still need to be reordered\n\n      v.wrapAroundElements = activeSectionItem; // Recalculate animation variables\n\n      v.dtop = getDestinationPosForInfiniteScroll(v);\n      v.yMovement = getYmovement(getState().activeSection, v.element);\n      return v;\n    }\n    /**\n    * Maintains the active slides in the viewport\n    * (Because the `scroll` animation might get lost with some actions, such as when using continuousVertical)\n    */\n\n    function keepSlidesPosition$1() {\n      var activeSlides = $(SLIDE_ACTIVE_SEL);\n\n      for (var i = 0; i < activeSlides.length; i++) {\n        silentLandscapeScroll(activeSlides[i], 'internal');\n      }\n    }\n\n    //@ts-check\n    /**\n    * Maintains the active slides in the viewport\n    * (Because the `scroll` animation might get lost with some actions, such as when using continuousVertical)\n    */\n\n    function keepSlidesPosition() {\n      var activeSlides = $(SLIDE_ACTIVE_SEL);\n\n      for (var i = 0; i < activeSlides.length; i++) {\n        silentLandscapeScroll(activeSlides[i], 'internal');\n      }\n    }\n    /**\n    * Fix section order after continuousVertical changes have been animated\n    */\n\n\n    function continuousVerticalFixSectionOrder(v) {\n      // If continuousVertical is in effect (and autoScrolling would also be in effect then),\n      // finish moving the elements around so the direct navigation will function more simply\n      if (v.wrapAroundElements == null) {\n        return;\n      }\n\n      if (v.isMovementUp) {\n        before($(SECTION_SEL)[0], v.wrapAroundElements);\n      } else {\n        after($(SECTION_SEL)[getState().sections.length - 1], prevAll(v.element, SECTION_SEL).reverse());\n      }\n\n      silentScroll(getTmpPosition()); // Maintain the active slides visible in the viewport\n\n      keepSlidesPosition();\n      setState({\n        isDoingContinousVertical: false\n      });\n    }\n\n    /**\n    * Makes sure lazyload is done for other sections in the viewport that are not the\n    * active one. \n    */\n\n    function lazyLoadOthers() {\n      var hasAutoHeightSections = $(AUTO_HEIGHT_SEL)[0] || isResponsiveMode() && $(AUTO_HEIGHT_RESPONSIVE_SEL)[0]; //quitting when it doesn't apply\n\n      if (!getOptions().lazyLoading || !hasAutoHeightSections) {\n        return;\n      } //making sure to lazy load auto-height sections that are in the viewport\n\n\n      $(SECTION_SEL + ':not(' + ACTIVE_SEL + ')').forEach(function (section) {\n        if (isSectionInViewport(section)) {\n          lazyLoadPanels(getPanelByElement(getState().sections, section));\n        }\n      });\n    }\n    /**\n    * Determines whether a section is in the viewport or not.\n    */\n\n    function isSectionInViewport(el) {\n      var rect = el.getBoundingClientRect();\n      var top = rect.top;\n      var bottom = rect.bottom; //sometimes there's a 1px offset on the bottom of the screen even when the \n      //section's height is the window.innerHeight one. I guess because pixels won't allow decimals.\n      //using this prevents from lazyLoading the section that is not yet visible \n      //(only 1 pixel offset is)\n\n      var pixelOffset = 2;\n      var isTopInView = top + pixelOffset < state.windowsHeight && top > 0;\n      var isBottomInView = bottom > pixelOffset && bottom < state.windowsHeight;\n      return isTopInView || isBottomInView;\n    }\n\n    function tooltipTextHandler() {\n      /*jshint validthis:true */\n      trigger(prev(this), 'click');\n    }\n    /**\n    * Activating the vertical navigation bullets according to the given slide name.\n    */\n\n    function activateNavDots(name, sectionIndex) {\n      var nav = $(SECTION_NAV_SEL)[0];\n\n      if (getOptions().navigation && nav != null && nav.style.display !== 'none') {\n        removeClass($(ACTIVE_SEL, nav), ACTIVE);\n\n        if (name) {\n          addClass($('a[href=\"#' + name + '\"]', nav), ACTIVE);\n        } else {\n          addClass($('a', $('li', nav)[sectionIndex]), ACTIVE);\n        }\n      }\n    }\n    /**\n    * Creates a vertical navigation bar.\n    */\n\n    function addVerticalNavigation() {\n      remove($(SECTION_NAV_SEL));\n      var navigation = doc.createElement('div');\n      navigation.setAttribute('id', SECTION_NAV);\n      var divUl = doc.createElement('ul');\n      navigation.appendChild(divUl);\n      appendTo(navigation, $body);\n      var nav = $(SECTION_NAV_SEL)[0];\n      addClass(nav, 'fp-' + getOptions().navigationPosition);\n\n      if (getOptions().showActiveTooltip) {\n        addClass(nav, SHOW_ACTIVE_TOOLTIP);\n      }\n\n      var li = '';\n\n      for (var i = 0; i < getState().sections.length; i++) {\n        var section = getState().sections[i];\n        var link = '';\n\n        if (getOptions().anchors.length) {\n          link = section.anchor;\n        }\n\n        li += '<li><a href=\"#' + encodeURI(link) + '\"><span class=\"fp-sr-only\">' + getBulletLinkName(section.index(), 'Section') + '</span><span></span></a>'; // Only add tooltip if needed (defined by user)\n\n        var tooltip = getOptions().navigationTooltips[section.index()];\n\n        if (typeof tooltip !== 'undefined' && tooltip !== '') {\n          li += '<div class=\"' + SECTION_NAV_TOOLTIP + ' fp-' + getOptions().navigationPosition + '\">' + tooltip + '</div>';\n        }\n\n        li += '</li>';\n      }\n\n      $('ul', nav)[0].innerHTML = li; //activating the current active section\n\n      var bullet = $('li', $(SECTION_NAV_SEL)[0])[getState().activeSection.index()];\n      addClass($('a', bullet), ACTIVE);\n    } //Scrolls to the section when clicking the navigation bullet\n\n    function sectionBulletHandler(e) {\n      if (e.preventDefault) {\n        preventDefault(e);\n      }\n\n      setState({\n        scrollTrigger: 'verticalNav'\n      });\n      /*jshint validthis:true */\n      // @ts-ignore\n\n      var indexBullet = index(closest(this, SECTION_NAV_SEL + ' li'));\n      EventEmitter.emit(events.scrollPage, {\n        destination: getState().sections[indexBullet]\n      });\n    }\n\n    /**\n    * Sets to active the current menu and vertical nav items.\n    */\n\n    function activateMenuAndNav(anchor, index) {\n      activateMenuElement(anchor);\n      activateNavDots(anchor, index);\n    }\n    /**\n    * Activating the website main menu elements according to the given slide name.\n    */\n\n    function activateMenuElement(name) {\n      if (getOptions().menu && getOptions().menu.length) {\n        $(getOptions().menu).forEach(function (menu) {\n          if (menu != null) {\n            removeClass($(ACTIVE_SEL, menu), ACTIVE);\n            addClass($('[data-menuanchor=\"' + name + '\"]', menu), ACTIVE);\n          }\n        });\n      }\n    }\n\n    new Date().getTime();\n    /**\n     * Triggers the callback once per scroll wheel action.\n     * Based on scrolling speed delay.\n     */\n\n    var oncePerScroll = function () {\n      var canTriggerEvent = true;\n      var prevWheelTime = new Date().getTime();\n      var result;\n      var isScrollingOnInit = !win.fullpage_api;\n      return function (scrollTrigger, callback) {\n        var currentTime = new Date().getTime();\n        var timeThreshold = scrollTrigger === 'wheel' ? getOptions().scrollingSpeed : 100;\n        canTriggerEvent = isScrollingOnInit || currentTime - prevWheelTime >= timeThreshold;\n        isScrollingOnInit = !win.fullpage_api;\n\n        if (canTriggerEvent) {\n          result = callback();\n          prevWheelTime = currentTime;\n        }\n\n        return typeof result !== 'undefined' ? result : true;\n      };\n    }();\n\n    /**\n    * Fires the wheel event once per mouse wheel trigger.\n    */\n\n    function fireCallbackOncePerScroll(callbackName, params) {\n      if (!isFunction(getOptions().beforeLeave)) {\n        return;\n      }\n\n      var result = oncePerScroll(getState().scrollTrigger, function () {\n        return fireCallback(callbackName, params);\n      });\n      return result;\n    }\n\n    FP.moveTo = moveTo;\n\n    FP.getScrollY = function () {\n      return state.scrollY;\n    };\n\n    var g_afterSectionLoadsId;\n    var g_transitionLapseId;\n    EventEmitter.on(events.onDestroy, onDestroy$8);\n    /**\n    * Scrolls the site to the given element and scrolls to the slide if a callback is given.\n    */\n\n    function scrollPage(section, callback, isMovementUp) {\n      var element = section.item;\n\n      if (element == null) {\n        return;\n      } //there's no element to scroll, leaving the function\n\n\n      var dtop = getDestinationPosition(element);\n      var slideAnchorLink;\n      var slideIndex; //local variables\n\n      var v = {\n        \"element\": element,\n        \"callback\": callback,\n        \"isMovementUp\": isMovementUp,\n        \"dtop\": dtop,\n        \"yMovement\": getYmovement(getState().activeSection, element),\n        \"anchorLink\": section.anchor,\n        \"sectionIndex\": section.index(),\n        \"activeSlide\": section.activeSlide ? section.activeSlide.item : null,\n        \"leavingSection\": getState().activeSection.index() + 1,\n        //caching the value of isResizing at the momment the function is called\n        //because it will be checked later inside a setTimeout and the value might change\n        \"localIsResizing\": state.isResizing,\n        \"items\": {\n          \"origin\": getState().activeSection,\n          \"destination\": section\n        },\n        \"direction\": null\n      }; //quiting when destination scroll is the same as the current one\n\n      if (getState().activeSection.item == element && !state.isResizing || getOptions().scrollBar && getScrollTop() === v.dtop && !hasClass(element, AUTO_HEIGHT)) {\n        return;\n      }\n\n      if (v.activeSlide != null) {\n        slideAnchorLink = getAttr(v.activeSlide, 'data-anchor');\n        slideIndex = index(v.activeSlide, null);\n      } //callback (onLeave) if the site is not just resizing and readjusting the slides\n\n\n      if (!v.localIsResizing) {\n        var direction = v.yMovement; //required for continousVertical\n\n        if (typeof isMovementUp !== 'undefined') {\n          direction = isMovementUp ? 'up' : 'down';\n        } //for the callback\n\n\n        v.direction = direction;\n\n        if (isFunction(getOptions().beforeLeave)) {\n          if (fireCallbackOncePerScroll('beforeLeave', v) === false) {\n            return;\n          }\n        }\n\n        if (isFunction(getOptions().onLeave)) {\n          if (!fireCallback('onLeave', v)) {\n            return;\n          }\n        }\n      } // If continuousVertical && we need to wrap around\n\n\n      if (getOptions().autoScrolling && getOptions().continuousVertical && typeof v.isMovementUp !== \"undefined\" && (!v.isMovementUp && v.yMovement == 'up' || // Intending to scroll down but about to go up or\n      v.isMovementUp && v.yMovement == 'down')) {\n        // intending to scroll up but about to go down\n        v = createInfiniteSections(v);\n      } //pausing media of the leaving section (if we are not just resizing, as destinatino will be the same one)\n\n\n      if (!v.localIsResizing) {\n        stopMedia(getState().activeSection.item);\n      }\n\n      addClass(element, ACTIVE);\n      removeClass(siblings(element), ACTIVE);\n      updateState();\n      lazyLoadPanels(section); //preventing from activating the MouseWheelHandler event\n      //more than once if the page is scrolling\n\n      setState({\n        canScroll: FP.test.isTesting\n      });\n      setPageStatus(slideIndex, slideAnchorLink, v.anchorLink);\n      EventEmitter.emit(events.onLeave, v);\n      performMovement(v); //flag to avoid callingn `scrollPage()` twice in case of using anchor links\n\n      setState({\n        lastScrolledDestiny: v.anchorLink\n      }); //avoid firing it twice (as it does also on scroll)\n\n      activateMenuAndNav(v.anchorLink, v.sectionIndex);\n    }\n\n    function onDestroy$8() {\n      clearTimeout(g_afterSectionLoadsId);\n      clearTimeout(g_transitionLapseId);\n    }\n    /**\n    * Returns the destination Y position based on the scrolling direction and\n    * the height of the section.\n    */\n\n\n    function getDestinationPosition(element) {\n      var elementHeight = element.offsetHeight;\n      var elementTop = element.offsetTop; //top of the desination will be at the top of the viewport\n\n      var position = elementTop;\n      var isScrollingDown = elementTop > state.previousDestTop;\n      var sectionBottom = position - getWindowHeight() + elementHeight;\n      var bigSectionsDestination = getOptions().bigSectionsDestination; //is the destination element bigger than the viewport?\n\n      if (elementHeight > getWindowHeight()) {\n        //scrolling up?\n        if (!isScrollingDown && !bigSectionsDestination || bigSectionsDestination === 'bottom') {\n          position = sectionBottom;\n        }\n      } //sections equal or smaller than the viewport height && scrolling down? ||  is resizing and its in the last section\n      else if (isScrollingDown || state.isResizing && next(element) == null) {\n        //The bottom of the destination will be at the bottom of the viewport\n        position = sectionBottom;\n      }\n      /*\n      Keeping record of the last scrolled position to determine the scrolling direction.\n      No conventional methods can be used as the scroll bar might not be present\n      AND the section might not be active if it is auto-height and didnt reach the middle\n      of the viewport.\n      */\n\n\n      setState({\n        previousDestTop: position\n      });\n      return position;\n    }\n    /**\n    * Performs the vertical movement (by CSS3 or by jQuery)\n    */\n\n    function performMovement(v) {\n      setState({\n        touchDirection: 'none',\n        scrollY: Math.round(v.dtop)\n      });\n      EventEmitter.emit(events.onPerformMovement, v);\n      var isFastSpeed = getOptions().scrollingSpeed < 700;\n      var transitionLapse = isFastSpeed ? 700 : getOptions().scrollingSpeed; // using CSS3 translate functionality\n\n      if (getOptions().css3 && getOptions().autoScrolling && !getOptions().scrollBar) {\n        // The first section can have a negative value in iOS 10. Not quite sure why: -0.0142822265625\n        // that's why we round it to 0.\n        var translate3d = 'translate3d(0px, -' + Math.round(v.dtop) + 'px, 0px)';\n        transformContainer(translate3d, true); //even when the scrollingSpeed is 0 there's a little delay, which might cause the\n        //scrollingSpeed to change in case of using silentMoveTo();ç\n\n        if (getOptions().scrollingSpeed) {\n          clearTimeout(g_afterSectionLoadsId);\n          g_afterSectionLoadsId = setTimeout(function () {\n            afterSectionLoads$1(v); //disabling canScroll when using fastSpeed\n\n            setState({\n              canScroll: !isFastSpeed || FP.test.isTesting\n            });\n          }, getOptions().scrollingSpeed);\n        } else {\n          afterSectionLoads$1(v);\n        }\n      } // using JS to animate\n      else {\n        var scrollSettings = getScrollSettings(v.dtop);\n        FP.test.top = -v.dtop + 'px';\n        clearTimeout(g_afterSectionLoadsId);\n        scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function () {\n          if (getOptions().scrollBar) {\n            /* Hack!\n            The timeout prevents setting the most dominant section in the viewport as \"active\" when the user\n            scrolled to a smaller section by using the mousewheel (auto scrolling) rather than draging the scroll bar.\n             When using scrollBar:true It seems like the scroll events still getting propagated even after the scrolling animation has finished.\n            */\n            g_afterSectionLoadsId = setTimeout(function () {\n              afterSectionLoads$1(v);\n            }, 30);\n          } else {\n            afterSectionLoads$1(v); //disabling canScroll when using fastSpeed\n\n            setState({\n              canScroll: !isFastSpeed || FP.test.isTesting\n            });\n          }\n        });\n      } // enabling canScroll after the minimum transition laps\n\n\n      if (isFastSpeed) {\n        clearTimeout(g_transitionLapseId);\n        g_transitionLapseId = setTimeout(function () {\n          setState({\n            canScroll: true\n          });\n        }, transitionLapse);\n      }\n    }\n    /**\n    * Actions to do once the section is loaded.\n    */\n\n\n    function afterSectionLoads$1(v) {\n      setState({\n        isBeyondFullpage: false\n      });\n      continuousVerticalFixSectionOrder(v); //callback (afterLoad) if the site is not just resizing and readjusting the slides\n\n      if (isFunction(getOptions().afterLoad) && !v.localIsResizing) {\n        fireCallback('afterLoad', v);\n      }\n\n      updateState();\n\n      if (!v.localIsResizing) {\n        playMedia(v.element);\n      }\n\n      addClass(v.element, COMPLETELY);\n      removeClass(siblings(v.element), COMPLETELY);\n      lazyLoadOthers();\n      setState({\n        canScroll: true\n      });\n      EventEmitter.emit(events.afterSectionLoads, v);\n\n      if (isFunction(v.callback)) {\n        v.callback();\n      }\n    }\n\n    FP.setFitToSection = setFitToSection;\n    FP.fitToSection = fitToSection;\n    /**\n    * Sets fitToSection\n    */\n\n    function setFitToSection(value, type) {\n      setVariableState('fitToSection', value, type);\n    }\n    /**\n    * Fits the site to the nearest active section\n    */\n\n    function fitToSection() {\n      //checking fitToSection again in case it was set to false before the timeout delay\n      if (state.canScroll && getOptions().fitToSection) {\n        //allows to scroll to an active section and\n        //if the section is already active, we prevent firing callbacks\n        setState({\n          isResizing: true\n        });\n        scrollPage(state.activeSection);\n        setState({\n          isResizing: false\n        });\n      }\n    }\n\n    FP.setResponsive = setResponsive;\n    /**\n    * Checks if the site needs to get responsive and disables autoScrolling if so.\n    * A class `fp-responsive` is added to the plugin's container in case the user wants to use it for his own responsive CSS.\n    */\n\n    function responsive() {\n      var widthLimit = getOptions().responsive || getOptions().responsiveWidth; //backwards compatiblity\n\n      var heightLimit = getOptions().responsiveHeight; //only calculating what we need. Remember its called on the resize event.\n\n      var isBreakingPointWidth = widthLimit && win.innerWidth < widthLimit;\n      var isBreakingPointHeight = heightLimit && win.innerHeight < heightLimit;\n\n      if (widthLimit && heightLimit) {\n        setResponsive(isBreakingPointWidth || isBreakingPointHeight);\n      } else if (widthLimit) {\n        setResponsive(isBreakingPointWidth);\n      } else if (heightLimit) {\n        setResponsive(isBreakingPointHeight);\n      }\n    }\n    /**\n    * Turns fullPage.js to normal scrolling mode when the viewport `width` or `height`\n    * are smaller than the set limit values.\n    */\n\n    function setResponsive(active) {\n      var isResponsive = isResponsiveMode();\n\n      if (active) {\n        if (!isResponsive) {\n          setAutoScrolling(false, 'internal');\n          setFitToSection(false, 'internal');\n          hide($(SECTION_NAV_SEL));\n          addClass($body, RESPONSIVE);\n\n          if (isFunction(getOptions().afterResponsive)) {\n            getOptions().afterResponsive.call(getContainer(), active);\n          }\n        }\n      } else if (isResponsive) {\n        setAutoScrolling(getOriginals().autoScrolling, 'internal');\n        setFitToSection(getOriginals().autoScrolling, 'internal');\n        show($(SECTION_NAV_SEL));\n        removeClass($body, RESPONSIVE);\n\n        if (isFunction(getOptions().afterResponsive)) {\n          getOptions().afterResponsive.call(getContainer(), active);\n        }\n      }\n    }\n    /**\n    * Determines whether fullpage.js is in responsive mode or not.\n    */\n\n\n    function isResponsiveMode() {\n      return hasClass($body, RESPONSIVE);\n    }\n\n    function addTableClass(element) {\n      if (!getOptions().verticalCentered) {\n        return;\n      } // Overflowing sections when scrollOverflow is disabled will be autoHeight\n      // and won't require vertical aligment\n\n\n      if (!getOptions().scrollOverflow && scrollOverflowHandler.shouldBeScrollable(element.item)) {\n        return;\n      }\n\n      if (!scrollOverflowHandler.isScrollable(element)) {\n        //In case we are styling for the 2nd time as in with reponsiveSlides\n        if (!hasClass(element.item, TABLE)) {\n          addClass(element.item, TABLE);\n        }\n      }\n    }\n\n    var startingSection = null;\n    FP.getActiveSection = getActiveSection;\n    function getStartingSection() {\n      return startingSection;\n    }\n    /**\n    * Styling vertical sections\n    */\n\n    function styleSection(section) {\n      var sectionElem = section.item;\n      var hasSlides = section.allSlidesItems.length;\n      var index = section.index(); //if no active section is defined, the 1st one will be the default one\n\n      if (!getState().activeSection && section.isVisible) {\n        addClass(sectionElem, ACTIVE);\n        updateState();\n      }\n\n      if (!startingSection && section.isVisible) {\n        startingSection = getState().activeSection.item;\n      }\n\n      if (getOptions().paddingTop) {\n        css(sectionElem, {\n          'padding-top': getOptions().paddingTop\n        });\n      }\n\n      if (getOptions().paddingBottom) {\n        css(sectionElem, {\n          'padding-bottom': getOptions().paddingBottom\n        });\n      }\n\n      if (typeof getOptions().sectionsColor[index] !== 'undefined') {\n        css(sectionElem, {\n          'background-color': getOptions().sectionsColor[index]\n        });\n      }\n\n      if (typeof getOptions().anchors[index] !== 'undefined') {\n        sectionElem.setAttribute('data-anchor', section.anchor);\n      }\n\n      if (!hasSlides) {\n        addTableClass(section);\n      }\n    }\n    /**\n    * Gets the active section.\n    */\n\n    function getActiveSection() {\n      return getState().activeSection;\n    }\n\n    function getSectionFromPanel(panel) {\n      return panel.isSection ? panel : panel.parent;\n    }\n\n    var g_focusScrollableId;\n    EventEmitter.on(events.bindEvents, bindEvents$b);\n\n    function bindEvents$b() {\n      // We can't focus scrollOverflow before scrolling\n      // to the anchor (if we need to)\n      EventEmitter.on(events.onAfterRenderNoAnchor, afterRender);\n      EventEmitter.on(events.onLeave, scrollOverflowHandler.onLeave);\n      EventEmitter.on(events.onSlideLeave, scrollOverflowHandler.onLeave);\n      EventEmitter.on(events.afterSlideLoads, scrollOverflowHandler.afterLoad);\n      EventEmitter.on(events.afterSectionLoads, scrollOverflowHandler.afterLoad);\n      EventEmitter.on(events.onDestroy, onDestroy$7);\n      docAddEvent('keyup', scrollOverflowHandler.keyUpHandler);\n    }\n\n    function afterRender() {\n      if (getOptions().scrollOverflow && !getOptions().scrollBar) {\n        scrollOverflowHandler.makeScrollable();\n        scrollOverflowHandler.focusScrollable();\n      }\n    }\n\n    function onDestroy$7() {\n      EventEmitter.removeListener(events.onAfterRenderNoAnchor, afterRender);\n      docRemoveEvent('keyup', scrollOverflowHandler.keyUpHandler);\n    }\n\n    var scrollOverflowHandler = {\n      focusedElem: null,\n      shouldFocusScrollable: true,\n      isInnerScrollAllowed: true,\n      timeBeforeReachingLimit: null,\n      timeLastScroll: null,\n      preventScrollWithMouseWheel: function preventScrollWithMouseWheel(e) {\n        var activeSection = getState().activeSection;\n\n        if (!state.canScroll || isInsideIframe() && getOptions().scrollOverflow && scrollOverflowHandler.isScrollable(activeSection) && scrollOverflowHandler.isScrolled(getState().wheelDirection, activeSection.item)) {\n          preventDefault(e);\n          return false;\n        }\n      },\n      preventScrollWithKeyboard: function preventScrollWithKeyboard(e) {\n        if (!isInsideInput() && getOptions().keyboardScrolling) {\n          var directionKeys = [38, 33, 32, 40, 34, 36, 35];\n\n          if (directionKeys.indexOf(e.keyCode) > -1 && !scrollOverflowHandler.isInnerScrollAllowed) {\n            preventDefault(e);\n            return false;\n          }\n        }\n      },\n      keyUpHandler: function keyUpHandler() {\n        scrollOverflowHandler.shouldFocusScrollable = state.canScroll;\n      },\n      // Leaving sections or slides\n      onLeave: function onLeave() {\n        clearTimeout(g_focusScrollableId);\n        scrollOverflowHandler.isInnerScrollAllowed = false;\n      },\n      // Loading sections or slides\n      afterLoad: function afterLoad() {\n        scrollOverflowHandler.isInnerScrollAllowed = false; // Delaying it to avoid issues on Safari when focusing elements #4484 & #4493\n\n        clearTimeout(g_focusScrollableId);\n        g_focusScrollableId = setTimeout(function () {\n          scrollOverflowHandler.shouldFocusScrollable = state.canScroll;\n        }, 200);\n      },\n      // Unfocusing the scrollable element from the orgin section/slide\n      unfocusScrollable: function unfocusScrollable() {\n        if (doc.activeElement === this.focusedElem) {\n          // @ts-ignore\n          this.focusedElem.blur();\n          scrollOverflowHandler.isInnerScrollAllowed = false;\n        }\n      },\n      focusScrollable: function focusScrollable() {\n        if (!getOptions().scrollOverflow || !scrollOverflowHandler.shouldFocusScrollable) {\n          return;\n        }\n\n        scrollOverflowHandler.unfocusScrollable();\n        var scrollableItem = scrollOverflowHandler.getScrollableItem(getState().activeSection.item); // On desktop we focus the scrollable to be able to use the mouse wheel\n        // We avoid it on mobile due to a bug in iOS Safari\n\n        if (scrollableItem && !isTouchDevice && !isTouch) {\n          this.focusedElem = scrollableItem; // Forcing the focus on the next paint \n          // to avoid issue #4484 & #4493 on Safari\n\n          requestAnimationFrame(function () {\n            scrollableItem.focus({\n              preventScroll: true\n            });\n            scrollOverflowHandler.isInnerScrollAllowed = true;\n          });\n        }\n\n        scrollOverflowHandler.shouldFocusScrollable = false;\n      },\n      makeScrollable: function makeScrollable() {\n        if (getOptions().scrollOverflowMacStyle && !isMacDevice) {\n          addClass($body, 'fp-scroll-mac');\n        }\n\n        getState().panels.forEach(function (el) {\n          if (el.slides && el.slides.length) {\n            return;\n          }\n\n          if (hasClass(el.item, AUTO_HEIGHT_RESPONSIVE) && isResponsiveMode()) {\n            return;\n          } else {\n            var item = getSlideOrSection(el.item);\n            var shouldBeScrollable = scrollOverflowHandler.shouldBeScrollable(el.item);\n            var section = getSectionFromPanel(el);\n\n            if (isIE11) {\n              var toggleAction = shouldBeScrollable ? 'addClass' : 'removeClass';\n              utils[toggleAction](section.item, IS_OVERFLOW);\n              utils[toggleAction](el.item, IS_OVERFLOW);\n            } else {\n              addClass(section.item, IS_OVERFLOW);\n              addClass(el.item, IS_OVERFLOW);\n            }\n\n            if (!el.hasScroll) {\n              scrollOverflowHandler.createWrapper(item);\n              scrollOverflowHandler.bindEvents(item);\n            } // updating the state now in case \n            // this is executed on page load (after images load)\n\n\n            el.hasScroll = true;\n          }\n        });\n      },\n      bindEvents: function bindEvents(item) {\n        var scrollable = scrollOverflowHandler.getScrollableItem(item);\n\n        if (scrollable) {\n          scrollable.addEventListener('scroll', scrollOverflowHandler.onPanelScroll);\n        }\n\n        item.addEventListener('wheel', scrollOverflowHandler.preventScrollWithMouseWheel, {\n          passive: false\n        });\n        item.addEventListener('keydown', scrollOverflowHandler.preventScrollWithKeyboard, {\n          passive: false\n        });\n      },\n      unbindEvents: function unbindEvents(item) {\n        var scrollable = scrollOverflowHandler.getScrollableItem(item);\n\n        if (scrollable) {\n          scrollable.removeEventListener('scroll', scrollOverflowHandler.onPanelScroll);\n        }\n\n        item.removeEventListener('wheel', scrollOverflowHandler.preventScrollWithMouseWheel, {\n          passive: false\n        });\n        item.removeEventListener('keydown', scrollOverflowHandler.preventScrollWithKeyboard, {\n          passive: false\n        });\n      },\n      createWrapper: function createWrapper(item) {\n        var overflowWrapper = document.createElement('div');\n        overflowWrapper.className = OVERFLOW;\n        wrapInner(item, overflowWrapper);\n        overflowWrapper.setAttribute('tabindex', '-1');\n      },\n      destroyScrollable: function destroyScrollable(panel) {\n        if (panel.slides && panel.slides.length) {\n          return;\n        }\n\n        if (panel.hasScroll) {\n          scrollOverflowHandler.destroyWrapper(panel.item);\n          scrollOverflowHandler.unbindEvents(panel.item);\n          panel.hasScroll = false;\n        }\n      },\n      destroyWrapper: function destroyWrapper(item) {\n        var overflowWrapper = $(OVERFLOW_SEL, item)[0];\n\n        if (overflowWrapper) {\n          unwrap(overflowWrapper);\n          item.removeAttribute('tabindex');\n        }\n      },\n      getScrollableItem: function getScrollableItem(sectionItem) {\n        var panel = getSlideOrSection(sectionItem);\n        return $(OVERFLOW_SEL, panel)[0] || panel;\n      },\n      hasScroll: function hasScroll(panelItem) {\n        return hasClass(panelItem, OVERFLOW) || $(OVERFLOW_SEL, panelItem)[0] != null;\n      },\n      isScrollable: function isScrollable(panel) {\n        return panel.isSection && panel.activeSlide ? panel.activeSlide.hasScroll : panel.hasScroll;\n      },\n      shouldBeScrollable: function shouldBeScrollable(item) {\n        var scrollable = scrollOverflowHandler.getScrollableItem(item);\n        return scrollable.scrollHeight > win.innerHeight;\n      },\n      isScrolled: function isScrolled(direction, el) {\n        if (!state.canScroll) {\n          return false;\n        } // we won't allow scrolloverflow on scrollBar:true\n\n\n        if (getOptions().scrollBar) {\n          return true;\n        }\n\n        var scrollableItem = scrollOverflowHandler.getScrollableItem(el);\n\n        if (!getOptions().scrollOverflow || !hasClass(scrollableItem, OVERFLOW) || // Checking the section first \n        // In case they apply to both section + slide #4505\n        hasClass(el, 'fp-noscroll') || // Checking the slide (in case it has)\n        hasClass(getSlideOrSection(el), 'fp-noscroll')) {\n          return true;\n        } // ie11 wrongly calculates scrollHeight when using the CSS style\n        // overflow: auto   It adds 1 more pixel compared to offsetHeight\n\n\n        var ie11offset = isIE11 ? 1 : 0;\n        var positionY = scrollableItem.scrollTop;\n        var isTopReached = direction === 'up' && positionY <= 0;\n        var isBottomReached = direction === 'down' && scrollableItem.scrollHeight <= Math.ceil(scrollableItem.offsetHeight + positionY) + ie11offset;\n        var isScrolled = isTopReached || isBottomReached;\n\n        if (!isScrolled && direction !== 'none') {\n          this.timeBeforeReachingLimit = new Date().getTime();\n        }\n\n        return isScrolled;\n      },\n      shouldMovePage: function shouldMovePage() {\n        this.timeLastScroll = new Date().getTime();\n        var timeDiff = this.timeLastScroll - scrollOverflowHandler.timeBeforeReachingLimit;\n        var isUsingTouch = isTouchDevice || isTouch;\n        var isGrabbing = isUsingTouch && state.isGrabbing;\n        var isNotFirstTimeReachingLimit = state.isUsingWheel && timeDiff > 600;\n        return isGrabbing && timeDiff > 400 || isNotFirstTimeReachingLimit;\n      },\n      onPanelScroll: function () {\n        var prevPosition = 0;\n        return function (e) {\n          var currentPosition = e.target.scrollTop;\n          var direction = state.touchDirection !== 'none' ? state.touchDirection : prevPosition < currentPosition ? 'down' : 'up';\n          prevPosition = currentPosition;\n\n          if (isFunction(getOptions().onScrollOverflow)) {\n            fireCallback('onScrollOverflow', {\n              position: currentPosition,\n              direction: direction\n            });\n          }\n\n          if (hasClass(e.target, OVERFLOW) && state.canScroll) {\n            if (scrollOverflowHandler.isScrolled(direction, e.target) && scrollOverflowHandler.shouldMovePage()) {\n              // Checking again if we have a scrollable content\n              // To avoid issues like #4479 where the scroll event gets\n              // triggered after removing/hidding content if this was scrolled\n              if (scrollOverflowHandler.shouldBeScrollable(getState().activeSection.item)) {\n                EventEmitter.emit(events.onScrollOverflowScrolled, {\n                  direction: direction\n                });\n              }\n            }\n          }\n        };\n      }()\n    };\n\n    var g_afterSlideLoadsId;\n    FP.landscapeScroll = landscapeScroll;\n    EventEmitter.on(events.bindEvents, bindEvents$a);\n\n    function bindEvents$a() {\n      EventEmitter.on(events.onPerformMovement, onPerformMovement);\n    }\n\n    function onPerformMovement() {\n      clearTimeout(g_afterSlideLoadsId);\n      setState({\n        slideMoving: false\n      });\n    }\n    /**\n    * Scrolls horizontal sliders.\n    */\n\n\n    function landscapeScroll(slides, destiny, direction) {\n      var sectionElem = closest(slides, SECTION_SEL);\n      var section = getState().sections.filter(function (section) {\n        return section.item == sectionElem;\n      })[0];\n      var slide = section.slides.filter(function (slide) {\n        return slide.item == destiny;\n      })[0];\n      var v = {\n        \"slides\": slides,\n        \"destiny\": destiny,\n        \"direction\": direction,\n        \"destinyPos\": {\n          \"left\": destiny.offsetLeft\n        },\n        \"slideIndex\": slide.index(),\n        \"section\": sectionElem,\n        \"sectionIndex\": section.index(),\n        \"anchorLink\": section.anchor,\n        \"slidesNav\": $(SLIDES_NAV_SEL, sectionElem)[0],\n        \"slideAnchor\": slide.anchor,\n        \"prevSlide\": section.activeSlide.item,\n        \"prevSlideIndex\": section.activeSlide.index(),\n        \"items\": {\n          \"section\": section,\n          \"origin\": section.activeSlide,\n          \"destination\": slide\n        },\n        //caching the value of isResizing at the momment the function is called\n        //because it will be checked later inside a setTimeout and the value might change\n        \"localIsResizing\": state.isResizing\n      };\n      v.xMovement = getXmovement(v.prevSlideIndex, v.slideIndex);\n      v.direction = v.direction ? v.direction : v.xMovement; //important!! Only do it when not resizing\n\n      if (!v.localIsResizing) {\n        //preventing from scrolling to the next/prev section when using scrollHorizontally\n        setState({\n          canScroll: false\n        });\n      }\n\n      if (getOptions().onSlideLeave) {\n        //if the site is not just resizing and readjusting the slides\n        if (!v.localIsResizing && v.xMovement !== 'none') {\n          if (isFunction(getOptions().onSlideLeave)) {\n            if (fireCallback('onSlideLeave', v) === false) {\n              setState({\n                slideMoving: false\n              });\n              return;\n            }\n          }\n        }\n      }\n\n      addClass(destiny, ACTIVE);\n      removeClass(siblings(destiny), ACTIVE);\n      updateState();\n\n      if (!v.localIsResizing) {\n        stopMedia(v.prevSlide);\n        lazyLoadPanels(slide);\n      }\n\n      toggleControlArrows(v); //only changing the URL if the slides are in the current section (not for resize re-adjusting)\n\n      if (section.isActive && !v.localIsResizing) {\n        setPageStatus(v.slideIndex, v.slideAnchor, v.anchorLink);\n      }\n\n      EventEmitter.emit(events.onSlideLeave, v);\n      performHorizontalMove(slides, v, true);\n    }\n    /**\n    * Performs the horizontal movement. (CSS3 or jQuery)\n    *\n    * @param fireCallback {Boolean} - determines whether or not to fire the callback\n    */\n\n    function performHorizontalMove(slides, v, fireCallback) {\n      var destinyPos = v.destinyPos;\n      activeSlidesNavigation(v.slidesNav, v.slideIndex);\n      setState({\n        scrollX: Math.round(destinyPos.left)\n      });\n\n      if (getOptions().css3) {\n        var translate3d = 'translate3d(-' + Math.round(destinyPos.left) + 'px, 0px, 0px)';\n        FP.test.translate3dH[v.sectionIndex] = translate3d;\n        css(addAnimation($(SLIDES_CONTAINER_SEL, slides)), getTransforms(translate3d));\n        clearTimeout(g_afterSlideLoadsId);\n        g_afterSlideLoadsId = setTimeout(function () {\n          if (fireCallback) {\n            afterSlideLoads(v);\n          }\n        }, getOptions().scrollingSpeed);\n      } else {\n        FP.test.left[v.sectionIndex] = Math.round(destinyPos.left);\n        scrollTo(slides, Math.round(destinyPos.left), getOptions().scrollingSpeed, function () {\n          if (fireCallback) {\n            afterSlideLoads(v);\n          }\n        });\n      }\n    }\n    /**\n    * Retuns `right` or `left` depending on the scrolling movement to reach its destination\n    * from the current slide.\n    */\n\n\n    function getXmovement(fromIndex, toIndex) {\n      if (fromIndex == toIndex) {\n        return 'none';\n      }\n\n      if (fromIndex > toIndex) {\n        return 'left';\n      }\n\n      return 'right';\n    }\n\n    function onDestroy$6() {\n      clearTimeout(g_afterSlideLoadsId);\n    }\n\n    function afterSlideLoads(v) {\n      //if the site is not just resizing and readjusting the slides\n      if (!v.localIsResizing) {\n        if (isFunction(getOptions().afterSlideLoad)) {\n          fireCallback('afterSlideLoad', v);\n        } //needs to be inside the condition to prevent problems with continuousVertical and scrollHorizontally\n        //and to prevent double scroll right after a windows resize\n\n\n        setState({\n          canScroll: true\n        });\n        playMedia(v.destiny);\n        EventEmitter.emit(events.afterSlideLoads, v);\n      } //letting them slide again\n\n\n      setState({\n        slideMoving: false\n      });\n    }\n\n    /**\n    * Slides silently (with no animation) the active slider to the given slide.\n    * @param noCallback {bool} true or defined -> no callbacks\n    */\n\n    function silentLandscapeScroll(activeSlide, noCallbacks) {\n      setScrollingSpeed(0, 'internal');\n\n      if (typeof noCallbacks !== 'undefined') {\n        //preventing firing callbacks afterSlideLoad etc.\n        setState({\n          isResizing: true\n        });\n      }\n\n      landscapeScroll(closest(activeSlide, SLIDES_WRAPPER_SEL), activeSlide);\n\n      if (typeof noCallbacks !== 'undefined') {\n        setState({\n          isResizing: false\n        });\n      }\n\n      setScrollingSpeed(getOriginals().scrollingSpeed, 'internal');\n    }\n\n    var g_prevActiveSectionIndex = null;\n    var g_prevActiveSlideIndex = null;\n    EventEmitter.on(events.onDestroyAll, onDestroyAll);\n\n    function onDestroyAll() {\n      g_prevActiveSectionIndex = null;\n      g_prevActiveSlideIndex = null;\n    }\n    /** \n     * Updates the state of the app.\n     */\n\n\n    function updateState() {\n      state.activeSection = null;\n      state.sections.map(function (section) {\n        var isActive = hasClass(section.item, ACTIVE);\n        section.isActive = isActive;\n        section.hasScroll = scrollOverflowHandler.hasScroll(section.item);\n\n        if (isActive) {\n          state.activeSection = section;\n        }\n\n        if (section.slides.length) {\n          section.activeSlide = null;\n          section.slides.map(function (slide) {\n            var isActiveSlide = hasClass(slide.item, ACTIVE);\n            slide.hasScroll = scrollOverflowHandler.hasScroll(section.item);\n            slide.isActive = isActiveSlide;\n\n            if (isActiveSlide) {\n              section.activeSlide = slide;\n            }\n          });\n\n          if (!section.slides.find(function (slide) {\n            return slide.isActive;\n          })) {\n            // RTL: start from last slide, otherwise start from first\n            var defaultSlide = getOptions().rtl && section.slides.length > 0 ? section.slides[section.slides.length - 1] : section.slides[0];\n            section.activeSlide = defaultSlide;\n\n            if (section.activeSlide) {\n              section.activeSlide.isActive = true;\n            }\n          }\n        }\n      });\n      scrollToNewActivePanel();\n    }\n    function updateStructuralState() {\n      var allSectionItems = $(getOptions().sectionSelector, getContainer());\n      var sectionsItems = getVisible(allSectionItems);\n      var allSections = Array.from(allSectionItems).map(function (item) {\n        return new SectionPanel(item);\n      });\n      var sections = allSections.filter(function (item) {\n        return item.isVisible;\n      });\n      var slides = sections.reduce(function (acc, section) {\n        return acc.concat(section.slides);\n      }, []); // keeping track of the previously active section\n\n      g_prevActiveSectionIndex = getPrevActivePanelIndex(state.activeSection);\n      g_prevActiveSlideIndex = getPrevActivePanelIndex(state.activeSection ? state.activeSection.activeSlide : null);\n      state.numSections = sectionsItems.length;\n      state.numSlides = sections.reduce(function (acc, section) {\n        return acc + section.slides.length;\n      }, 0);\n      state.sections = sections;\n      state.sectionsIncludingHidden = allSections;\n      state.slides = slides;\n      state.panels = state.sections.concat(state.slides);\n    }\n\n    function getPrevActivePanelIndex(activePanel) {\n      if (!activePanel) {\n        return null;\n      }\n\n      var prevActivePanelItem = activePanel ? activePanel.item : null;\n      var hiddenPanels = activePanel.isSection ? state.sectionsIncludingHidden : state.activeSection.slidesIncludingHidden;\n\n      if (prevActivePanelItem) {\n        var panel = getPanelByElement(hiddenPanels, prevActivePanelItem);\n        return panel ? panel.index() : null;\n      }\n\n      return null;\n    }\n    /**\n     * When changes in the DOM take place there's a change \n     * the active section is now hidden or removed. \n     * fullPage.js will scroll to the closest section nearby.\n     */\n\n\n    function scrollToNewActivePanel() {\n      var activeSection = state.activeSection;\n      var activeSectionHasSlides = state.activeSection ? state.activeSection.slides.length : false;\n      var activeSlide = state.activeSection ? state.activeSection.activeSlide : null; // Hidding / removing the active section ?\n\n      if (!activeSection && state.sections.length && !getState().isBeyondFullpage && g_prevActiveSectionIndex !== null) {\n        var newActiveSection = getNewActivePanel(g_prevActiveSectionIndex, state.sections);\n\n        if (newActiveSection) {\n          state.activeSection = newActiveSection;\n          state.activeSection.isActive = true;\n          addClass(state.activeSection.item, ACTIVE);\n        }\n\n        if (state.activeSection) {\n          silentScroll(state.activeSection.item.offsetTop);\n        }\n      }\n\n      if (activeSectionHasSlides && !activeSlide && g_prevActiveSlideIndex !== null) {\n        var newActiveSlide = getNewActivePanel(g_prevActiveSlideIndex, state.activeSection.slides);\n\n        if (newActiveSlide) {\n          state.activeSection.activeSlide = newActiveSlide;\n          state.activeSection.activeSlide.isActive = true;\n          addClass(state.activeSection.activeSlide.item, ACTIVE);\n        }\n\n        if (state.activeSection.activeSlide) {\n          silentLandscapeScroll(state.activeSection.activeSlide.item, 'internal');\n        }\n      }\n    }\n\n    function getNewActivePanel(prevActivePanelIndex, siblings) {\n      var newActiveSection;\n      var prevIndex = prevActivePanelIndex - 1;\n      var nextIndex = prevActivePanelIndex;\n\n      do {\n        newActiveSection = siblings[prevIndex] || siblings[nextIndex];\n\n        if (newActiveSection) {\n          break;\n        }\n\n        prevIndex = prevIndex - 1;\n        nextIndex = nextIndex + 1;\n      } while (prevIndex >= 0 || nextIndex < siblings.length);\n\n      return newActiveSection;\n    }\n    /**\n    * Section object\n    */\n\n\n    var SectionPanel = function SectionPanel(el) {\n      var _this = this;\n\n      [].push.call(arguments, getOptions().sectionSelector);\n      Item.apply(this, arguments);\n      this.allSlidesItems = $(getOptions().slideSelector, el);\n      this.slidesIncludingHidden = Array.from(this.allSlidesItems).map(function (item) {\n        return new SlidePanel(item, _this);\n      });\n      this.slides = this.slidesIncludingHidden.filter(function (slidePanel) {\n        return slidePanel.isVisible;\n      }); // RTL: start from last slide, otherwise start from first\n\n      var defaultSlide = getOptions().rtl && this.slides.length > 0 ? this.slides[this.slides.length - 1] : this.slides.length > 0 ? this.slides[0] : null;\n      this.activeSlide = this.slides.length ? this.slides.filter(function (slide) {\n        return slide.isActive;\n      })[0] || defaultSlide : null;\n\n      if (this.activeSlide) {\n        this.activeSlide.isActive = true;\n      }\n    };\n    SectionPanel.prototype = Item.prototype;\n    SectionPanel.prototype.constructor = SectionPanel;\n    /**\n    * Slide object\n    */\n\n    var SlidePanel = function SlidePanel(el, section) {\n      this.parent = section;\n      Item.call(this, el, getOptions().slideSelector);\n    };\n\n    SlidePanel.prototype = Item.prototype;\n    SlidePanel.prototype.constructor = SectionPanel;\n\n    /**\n    * Adds internal classes to be able to provide customizable selectors\n    * keeping the link with the style sheet.\n    */\n\n    function addInternalSelectors() {\n      addClass($(getOptions().sectionSelector, getContainer()), SECTION);\n      addClass($(getOptions().slideSelector, getContainer()), SLIDE);\n    }\n\n    /**\n    * Styles the horizontal slides for a section.\n    */\n\n    function styleSlides(section) {\n      var numSlides = section.slides.length;\n      var slidesElems = section.allSlidesItems;\n      var slides = section.slides;\n      var sliderWidth = numSlides * 100;\n      var slideWidth = 100 / numSlides;\n\n      if (!$(SLIDES_WRAPPER_SEL, section.item)[0]) {\n        var slidesWrapper = doc.createElement('div');\n        slidesWrapper.className = SLIDES_WRAPPER; //fp-slides\n\n        wrapAll(slidesElems, slidesWrapper);\n        var slidesContainer = doc.createElement('div');\n        slidesContainer.className = SLIDES_CONTAINER; //fp-slidesContainer\n\n        wrapAll(slidesElems, slidesContainer);\n      }\n\n      css($(SLIDES_CONTAINER_SEL, section.item), {\n        'width': sliderWidth + '%'\n      });\n\n      if (numSlides > 1) {\n        if (getOptions().controlArrows) {\n          createSlideArrows(section);\n        }\n\n        if (getOptions().slidesNavigation) {\n          addSlidesNavigation(section);\n        }\n      }\n\n      slides.forEach(function (slide) {\n        css(slide.item, {\n          'width': slideWidth + '%'\n        });\n\n        if (getOptions().verticalCentered) {\n          addTableClass(slide);\n        }\n      });\n      var startingSlide = section.activeSlide || null; //if the slide won't be an starting point, the default will be the first one (or last one for RTL)\n      //the active section isn't the first one? Is not the first slide of the first section? Then we load that section/slide by default.\n\n      if (startingSlide != null && state.activeSection && (state.activeSection.index() !== 0 || state.activeSection.index() === 0 && startingSlide.index() !== 0)) {\n        silentLandscapeScroll(startingSlide.item, 'internal');\n      } else {\n        // RTL: start from last slide, otherwise start from first\n        var defaultSlideIndex = getOptions().rtl && slidesElems.length > 0 ? slidesElems.length - 1 : 0;\n        addClass(slidesElems[defaultSlideIndex], ACTIVE);\n      }\n    }\n\n    var g_wrapperObserver;\n    var g_wrapperObserveConfig = {\n      attributes: false,\n      subtree: true,\n      childList: true,\n      characterData: true\n    };\n    EventEmitter.on(events.bindEvents, bindEvents$9);\n    EventEmitter.on(events.onDestroy, unbindEvents);\n    FP[\"render\"] = onContentChange;\n\n    function bindEvents$9() {\n      if (getOptions().observer && \"MutationObserver\" in window && $(WRAPPER_SEL)[0]) {\n        g_wrapperObserver = createObserver($(WRAPPER_SEL)[0], onContentChange, g_wrapperObserveConfig);\n      }\n\n      EventEmitter.on(events.contentChanged, onContentChange);\n    }\n\n    function unbindEvents() {\n      if (g_wrapperObserver) {\n        g_wrapperObserver.disconnect();\n        g_wrapperObserver = null;\n      }\n    }\n    /**\n     * Creates a Mutation observer.\n     */\n\n\n    function createObserver(target, callback, config) {\n      var observer = new MutationObserver(callback);\n      observer.observe(target, config);\n      return observer;\n    }\n\n    function didSlidesChange() {\n      return getVisible($(getOptions().slideSelector, getContainer())).length !== getState().numSlides;\n    }\n\n    function didSectionsChange() {\n      return getVisible($(getOptions().sectionSelector, getContainer())).length !== getState().numSections;\n    }\n\n    function didSectionsOrSlidesChange() {\n      return didSlidesChange() || didSectionsChange();\n    }\n    /**\n     * Listen to changes on sections and fires reBuild\n     * when those changes affect the section height.\n     */\n\n\n    function onContentChange(mutations) {\n      var _didSlidesChange = didSlidesChange();\n\n      if (didSectionsOrSlidesChange() && !state.isDoingContinousVertical) {\n        if (getOptions().observer && g_wrapperObserver) {\n          // Temporally disabling the observer while \n          // we modidy the DOM again\n          g_wrapperObserver.disconnect();\n        }\n\n        updateStructuralState();\n        updateState(); // Removing navs and anchors options\n\n        getOptions().anchors = [];\n        remove($(SECTION_NAV_SEL));\n        addInternalSelectors();\n        setOptionsFromDOM();\n\n        if (getOptions().navigation) {\n          addVerticalNavigation();\n        }\n\n        if (getOptions().scrollOverflow) {\n          scrollOverflowHandler.makeScrollable();\n        }\n\n        if (_didSlidesChange) {\n          remove($(SLIDES_NAV_SEL));\n          remove($(SLIDES_ARROW_SEL));\n        }\n\n        getState().sections.forEach(function (section) {\n          if (section.slides.length) {\n            if (_didSlidesChange) {\n              styleSlides(section);\n            }\n          } else {\n            styleSection(section);\n          }\n        });\n      }\n\n      if (getOptions().observer && g_wrapperObserver && $(WRAPPER_SEL)[0]) {\n        g_wrapperObserver.observe($(WRAPPER_SEL)[0], g_wrapperObserveConfig);\n      }\n    }\n\n    var supportsPassiveEvents = function () {\n      //cheks for passive event support\n      var g_supportsPassive = false;\n\n      try {\n        var opts = Object.defineProperty({}, 'passive', {\n          get: function get() {\n            g_supportsPassive = true;\n          }\n        });\n        windowAddEvent(\"testPassive\", null, opts);\n        windowRemoveEvent(\"testPassive\", null, opts);\n      } catch (e) {}\n\n      return function () {\n        return g_supportsPassive;\n      };\n    }();\n\n    function getPassiveOptionsIfPossible() {\n      return supportsPassiveEvents() ? {\n        passive: false\n      } : false;\n    }\n\n    var wheelDataHandler = function () {\n      var _prevTime = new Date().getTime();\n\n      var _scrollings = [];\n      var isScrollingVertically;\n      var direction;\n      return {\n        registerEvent: function registerEvent(e) {\n          e = e || win.event;\n          var value = e.wheelDelta || -e.deltaY || -e.detail;\n          var delta = Math.max(-1, Math.min(1, value));\n          var horizontalDetection = typeof e.wheelDeltaX !== 'undefined' || typeof e.deltaX !== 'undefined';\n          isScrollingVertically = Math.abs(e.wheelDeltaX) < Math.abs(e.wheelDelta) || Math.abs(e.deltaX) < Math.abs(e.deltaY) || !horizontalDetection;\n          var curTime = new Date().getTime();\n          direction = delta < 0 ? 'down' : 'up'; //Limiting the array to 150 (lets not waste memory!)\n\n          if (_scrollings.length > 149) {\n            _scrollings.shift();\n          } //keeping record of the previous scrollings\n\n\n          _scrollings.push(Math.abs(value)); //time difference between the last scroll and the current one\n\n\n          var timeDiff = curTime - _prevTime;\n          _prevTime = curTime; //haven't they scrolled in a while?\n          //(enough to be consider a different scrolling action to scroll another section)\n\n          if (timeDiff > 200) {\n            //emptying the array, we dont care about old scrollings for our averages\n            _scrollings = [];\n          }\n        },\n        isAccelerating: function isAccelerating() {\n          var averageEnd = getAverage(_scrollings, 10);\n          var averageMiddle = getAverage(_scrollings, 70);\n          var isAccelerating = averageEnd >= averageMiddle;\n          return _scrollings.length ? isAccelerating && isScrollingVertically : false;\n        },\n        getDirection: function getDirection() {\n          return direction;\n        }\n      };\n    }();\n\n    function scrollBeyondFullPage() {\n      var dtop = getDestinationOffset();\n      var scrollSettings = getScrollSettings(dtop);\n      FP.test.top = -dtop + 'px';\n      setState({\n        canScroll: false\n      });\n      scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function () {\n        setTimeout(function () {\n          setState({\n            isBeyondFullpage: true\n          });\n          setState({\n            canScroll: true\n          });\n        }, 30);\n      });\n    }\n    function onKeyDown() {\n      if (!isFullPageAbove()) {\n        return;\n      } else {\n        scrollUpToFullpage();\n      }\n    }\n    function scrollUpToFullpage() {\n      var scrollSettings = getScrollSettings(getLast(getState().sections).item.offsetTop);\n      setState({\n        canScroll: false\n      });\n      scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function () {\n        setState({\n          canScroll: true\n        });\n        setState({\n          isBeyondFullpage: false\n        });\n        setState({\n          isAboutToScrollToFullPage: false\n        });\n      });\n    }\n\n    function getDestinationOffset() {\n      if (!getOptions().css3) {\n        return getLast(getState().sections).item.offsetTop + getLast(getState().sections).item.offsetHeight;\n      }\n\n      return getScrollTop() + getWindowHeight();\n    }\n\n    function beyondFullPageHandler(container, e) {\n      new Date().getTime();\n      var pauseScroll = getState().isBeyondFullpage && container.getBoundingClientRect().bottom >= 0 && wheelDataHandler.getDirection() === 'up';\n      var g_isAboutToScrollToFullPage = getState().isAboutToScrollToFullPage;\n\n      if (g_isAboutToScrollToFullPage) {\n        preventDefault(e);\n        return false;\n      }\n\n      if (getState().isBeyondFullpage) {\n        if (!pauseScroll) {\n          keyframeTime('set', 'beyondFullpage', 1000);\n        } else {\n          var shouldSetFixedPosition = !g_isAboutToScrollToFullPage && (!keyframeTime('isNewKeyframe', 'beyondFullpage') || !wheelDataHandler.isAccelerating());\n          var scrollSettings;\n\n          if (shouldSetFixedPosition) {\n            scrollSettings = getScrollSettings(getLast(getState().sections).item.offsetTop + getLast(getState().sections).item.offsetHeight);\n            scrollSettings.element.scrollTo(0, scrollSettings.options);\n            setState({\n              isAboutToScrollToFullPage: false\n            });\n            preventDefault(e);\n            return false;\n          } else if (wheelDataHandler.isAccelerating()) {\n            pauseScroll = false;\n            setState({\n              isAboutToScrollToFullPage: true\n            });\n            setState({\n              scrollTrigger: 'wheel'\n            });\n            scrollUpToFullpage();\n            preventDefault(e);\n            return false;\n          }\n        }\n\n        if (!g_isAboutToScrollToFullPage) {\n          // allow normal scrolling, but quitting\n          if (!pauseScroll) {\n            return true;\n          }\n        }\n      }\n    }\n\n    var keyframeTime = function () {\n      var isNew = false;\n      var frames = {};\n      var timeframes = {};\n      return function (action, name, timeframe) {\n        switch (action) {\n          case 'set':\n            frames[name] = new Date().getTime();\n            timeframes[name] = timeframe;\n            break;\n\n          case 'isNewKeyframe':\n            var current = new Date().getTime();\n            isNew = current - frames[name] > timeframes[name];\n            break;\n        }\n\n        return isNew;\n      };\n    }();\n\n    FP.moveSectionDown = moveSectionDown;\n    /**\n    * Moves the page down one section.\n    */\n\n    function moveSectionDown() {\n      var next = getState().activeSection.next(); //looping to the top if there's no more sections below\n\n      if (!next && (getOptions().loopBottom || getOptions().continuousVertical)) {\n        next = getState().sections[0];\n      }\n\n      if (next != null) {\n        scrollPage(next, null, false);\n      } else if (hasContentBeyondFullPage()) {\n        EventEmitter.emit(events.scrollBeyondFullpage);\n      }\n    }\n\n    function hasContentBeyondFullPage() {\n      return getContainer().scrollHeight < $body.scrollHeight && getOptions().scrollBar && getOptions().scrollBeyondFullpage;\n    }\n\n    FP.moveSectionUp = moveSectionUp;\n    /**\n    * Moves the page up one section.\n    */\n\n    function moveSectionUp() {\n      var prev = getState().activeSection.prev(); //looping to the bottom if there's no more sections above\n\n      if (!prev && (getOptions().loopTop || getOptions().continuousVertical)) {\n        prev = getLast(getState().sections);\n      }\n\n      if (prev != null) {\n        scrollPage(prev, null, true);\n      }\n    }\n\n    var oldPageY = 0;\n    /**\n    * Detecting the direction of the mouse movement.\n    * Used only for the middle button of the mouse.\n    */\n\n    function mouseMoveHandler(e) {\n      if (!getOptions().autoScrolling) {\n        return;\n      }\n\n      if (state.canScroll) {\n        // moving up\n        if (e.pageY < oldPageY && getIsScrollAllowed().m.up) {\n          moveSectionUp();\n        } // moving down\n        else if (e.pageY > oldPageY && getIsScrollAllowed().m.down) {\n          moveSectionDown();\n        }\n      }\n\n      oldPageY = e.pageY;\n    }\n    function setOldPageY(value) {\n      oldPageY = value;\n    }\n\n    /**\n    * Determines the way of scrolling up or down:\n    * by 'automatically' scrolling a section or by using the default and normal scrolling.\n    */\n\n    function scrolling(type) {\n      if (!getIsScrollAllowed().m[type]) {\n        return;\n      }\n\n      var scrollSection = type === 'down' ? moveSectionDown : moveSectionUp;\n\n      if (getOptions().scrollOverflow && scrollOverflowHandler.isScrollable(getState().activeSection)) {\n        //is the scrollbar at the start/end of the scroll?\n        if (scrollOverflowHandler.isScrolled(type, getState().activeSection.item) && scrollOverflowHandler.shouldMovePage()) {\n          scrollSection();\n        }\n      } else {\n        scrollSection();\n      }\n    }\n\n    var touchStartY = 0;\n    var touchStartX = 0;\n    var touchEndY = 0;\n    var touchEndX = 0;\n    var MSPointer = getMSPointer();\n    var pointers = {\n      touchmove: 'ontouchmove' in window ? 'touchmove' : MSPointer ? MSPointer.move : null,\n      touchstart: 'ontouchstart' in window ? 'touchstart' : MSPointer ? MSPointer.down : null\n    };\n    /**\n    * Adds the possibility to auto scroll through sections on touch devices.\n    */\n\n    function addTouchHandler() {\n      if (!pointers.touchmove) {\n        return;\n      }\n\n      if (isTouchDevice || isTouch) {\n        if (getOptions().autoScrolling) {\n          $body.removeEventListener(pointers.touchmove, preventBouncing, {\n            passive: false\n          });\n          $body.addEventListener(pointers.touchmove, preventBouncing, {\n            passive: false\n          });\n        }\n\n        var touchWrapper = getOptions().touchWrapper;\n        touchWrapper.removeEventListener(pointers.touchstart, touchStartHandler);\n        touchWrapper.removeEventListener(pointers.touchmove, touchMoveHandler, {\n          passive: false\n        });\n        touchWrapper.addEventListener(pointers.touchstart, touchStartHandler);\n        touchWrapper.addEventListener(pointers.touchmove, touchMoveHandler, {\n          passive: false\n        });\n      }\n    }\n    /**\n    * Removes the auto scrolling for touch devices.\n    */\n\n    function removeTouchHandler() {\n      if (!pointers.touchmove) {\n        return;\n      }\n\n      if (isTouchDevice || isTouch) {\n        // normalScrollElements requires it off #2691\n        if (getOptions().autoScrolling) {\n          $body.removeEventListener(pointers.touchmove, touchMoveHandler, {\n            passive: false\n          });\n          $body.removeEventListener(pointers.touchmove, preventBouncing, {\n            passive: false\n          });\n        }\n\n        var touchWrapper = getOptions().touchWrapper;\n        touchWrapper.removeEventListener(pointers.touchstart, touchStartHandler);\n        touchWrapper.removeEventListener(pointers.touchmove, touchMoveHandler, {\n          passive: false\n        });\n      }\n    }\n    /* Detecting touch events\n\n    * As we are changing the top property of the page on scrolling, we can not use the traditional way to detect it.\n    * This way, the touchstart and the touch moves shows an small difference between them which is the\n    * used one to determine the direction.\n    */\n\n    function touchMoveHandler(e) {\n      var activeSection = closest(e.target, SECTION_SEL) || getState().activeSection.item;\n      var hasActiveSectionOverflow = scrollOverflowHandler.isScrollable(getState().activeSection);\n\n      if (isReallyTouch(e)) {\n        setState({\n          isGrabbing: true,\n          isUsingWheel: false\n        });\n\n        if (getOptions().autoScrolling) {\n          if (hasActiveSectionOverflow && !state.canScroll || getOptions().scrollBar) {\n            //preventing the easing on iOS devices\n            preventDefault(e);\n          }\n        }\n\n        var touchEvents = getEventsPage(e);\n        touchEndY = touchEvents.y;\n        touchEndX = touchEvents.x;\n        var isVerticalMovementEnough = Math.abs(touchStartY - touchEndY) > win.innerHeight / 100 * getOptions().touchSensitivity;\n        var isHorizontalMovementEnough = Math.abs(touchStartX - touchEndX) > getWindowWidth() / 100 * getOptions().touchSensitivity;\n        var isHorizontalPredominantMove = $(SLIDES_WRAPPER_SEL, activeSection).length && Math.abs(touchStartX - touchEndX) > Math.abs(touchStartY - touchEndY);\n        var directionH = touchStartX > touchEndX ? 'right' : 'left';\n        var directionV = touchStartY > touchEndY ? 'down' : 'up';\n        var direction = isHorizontalPredominantMove ? directionH : directionV;\n        setState({\n          touchDirection: direction\n        }); //if movement in the X axys is greater than in the Y and the currect section has slides...\n\n        if (isHorizontalPredominantMove) {\n          //is the movement greater than the minimum resistance to scroll?\n          if (!state.slideMoving && isHorizontalMovementEnough) {\n            if (touchStartX > touchEndX) {\n              if (getIsScrollAllowed().m.right) {\n                EventEmitter.emit(events.moveSlideRight, {\n                  section: activeSection\n                });\n              }\n            } else {\n              if (getIsScrollAllowed().m.left) {\n                EventEmitter.emit(events.moveSlideLeft, {\n                  section: activeSection\n                });\n              }\n            }\n          }\n        } //vertical scrolling (only when autoScrolling is enabled)\n        else if (getOptions().autoScrolling && state.canScroll) {\n          //is the movement greater than the minimum resistance to scroll?\n          if (isVerticalMovementEnough) {\n            scrolling(directionV);\n          }\n        }\n      }\n    }\n    /**\n    * As IE >= 10 fires both touch and mouse events when using a mouse in a touchscreen\n    * this way we make sure that is really a touch event what IE is detecting.\n    */\n\n\n    function isReallyTouch(e) {\n      //if is not IE   ||  IE is detecting `touch` or `pen`\n      return typeof e.pointerType === 'undefined' || e.pointerType != 'mouse';\n    }\n    /**\n    * Handler for the touch start event.\n    */\n\n\n    function touchStartHandler(e) {\n      //stopping the auto scroll to adjust to a section\n      if (getOptions().fitToSection) {\n        setState({\n          activeAnimation: false\n        });\n      }\n\n      if (isReallyTouch(e)) {\n        var touchEvents = getEventsPage(e);\n        touchStartY = touchEvents.y;\n        touchStartX = touchEvents.x;\n      }\n\n      windowAddEvent('touchend', touchEndHandler);\n    }\n    /**\n    * Handler for the touch end event.\n    */\n\n\n    function touchEndHandler() {\n      windowRemoveEvent('touchend', touchEndHandler);\n      setState({\n        isGrabbing: false\n      });\n    }\n    /**\n    * Gets the pageX and pageY properties depending on the browser.\n    * https://github.com/alvarotrigo/fullPage.js/issues/194#issuecomment-34069854\n    */\n\n\n    function getEventsPage(e) {\n      var events = {};\n      events.y = typeof e.pageY !== 'undefined' && (e.pageY || e.pageX) ? e.pageY : e.touches[0].pageY;\n      events.x = typeof e.pageX !== 'undefined' && (e.pageY || e.pageX) ? e.pageX : e.touches[0].pageX; //in touch devices with scrollBar:true, e.pageY is detected, but we have to deal with touch events. #1008\n\n      if (isTouch && isReallyTouch(e) && getOptions().scrollBar && typeof e.touches !== 'undefined') {\n        events.y = e.touches[0].pageY;\n        events.x = e.touches[0].pageX;\n      }\n\n      return events;\n    }\n    /*\n    * Returns and object with Microsoft pointers (for IE<11 and for IE >= 11)\n    * http://msdn.microsoft.com/en-us/library/ie/dn304886(v=vs.85).aspx\n    */\n\n\n    function getMSPointer() {\n      var pointer; //IE >= 11 & rest of browsers\n\n      if (win.PointerEvent) {\n        pointer = {\n          down: 'pointerdown',\n          move: 'pointermove'\n        };\n      }\n\n      return pointer;\n    }\n    /*\n    * Preventing bouncing in iOS #2285\n    */\n\n\n    function preventBouncing(e) {\n      if (getOptions().autoScrolling && isReallyTouch(e) && getIsScrollAllowed().m.up) {\n        //preventing the easing on iOS devices\n        if (!state.canScroll) {\n          preventDefault(e);\n        }\n      }\n    }\n\n    FP.moveSlideLeft = moveSlideLeft;\n    FP.moveSlideRight = moveSlideRight;\n    /**\n    * Slides a slider to the given direction.\n    * Optional `section` param.\n    */\n\n    function moveSlide(direction, section) {\n      var activeSectionItem = section == null ? getState().activeSection.item : section;\n      var activeSection = getPanelByElement(state.sections, activeSectionItem);\n      var slides = $(SLIDES_WRAPPER_SEL, activeSectionItem)[0]; // more than one slide needed and nothing should be sliding\n\n      if (slides == null || state.slideMoving || activeSection.slides.length < 2) {\n        return;\n      }\n\n      var currentSlide = activeSection.activeSlide;\n      var destiny = direction === 'left' ? currentSlide.prev() : currentSlide.next(); //isn't there a next slide in the secuence?\n\n      if (!destiny) {\n        //respect loopHorizontal setting\n        if (!getOptions().loopHorizontal) return;\n        destiny = direction === 'left' ? getLast(activeSection.slides) : activeSection.slides[0];\n      }\n\n      setState({\n        slideMoving: !FP.test.isTesting\n      });\n      landscapeScroll(slides, destiny.item, direction);\n    }\n    /**\n    * Slides left the slider of the active section.\n    * Optional `section` param.\n    */\n\n    function moveSlideLeft(section) {\n      moveSlide('left', section);\n    }\n    /**\n    * Slides right the slider of the active section.\n    * Optional `section` param.\n    */\n\n    function moveSlideRight(section) {\n      moveSlide('right', section);\n    }\n\n    /**\n    * Gets a section by its anchor / index\n    */\n\n    function getSectionByAnchor(sectionAnchor) {\n      var section = getState().sections.filter(function (section) {\n        return section.anchor === sectionAnchor;\n      })[0];\n\n      if (!section) {\n        var sectionIndex = typeof sectionAnchor !== 'undefined' ? sectionAnchor - 1 : 0;\n        section = getState().sections[sectionIndex];\n      }\n\n      return section;\n    }\n\n    /**\n    * Scrolls the slider to the given slide destination for the given section\n    */\n\n    function scrollSlider(slideElem) {\n      if (slideElem != null) {\n        landscapeScroll(closest(slideElem, SLIDES_WRAPPER_SEL), slideElem);\n      }\n    }\n\n    /**\n    * Scrolls to the given section and slide anchors\n    */\n\n    function scrollPageAndSlide(sectionAnchor, slideAnchor) {\n      var section = getSectionByAnchor(sectionAnchor); //do nothing if there's no section with the given anchor name\n\n      if (section == null) return;\n      var slideElem = getSlideByAnchor(slideAnchor, section); //we need to scroll to the section and then to the slide\n\n      if ((!section.anchor || section.anchor !== state.lastScrolledDestiny) && !hasClass(section.item, ACTIVE)) {\n        scrollPage(section, function () {\n          scrollSlider(slideElem);\n        });\n      } //if we were already in the section\n      else {\n        scrollSlider(slideElem);\n      }\n    }\n    /**\n    * Gets a slide inside a given section by its anchor / index\n    */\n\n    function getSlideByAnchor(slideAnchor, section) {\n      var slide = section.slides.filter(function (slide) {\n        return slide.anchor === slideAnchor;\n      })[0];\n\n      if (slide == null) {\n        slideAnchor = typeof slideAnchor !== 'undefined' ? slideAnchor : 0;\n        slide = section.slides[slideAnchor];\n      }\n\n      return slide ? slide.item : null;\n    }\n\n    FP.moveTo = moveTo$1;\n    /**\n    * Moves the page to the given section and slide.\n    * Anchors or index positions can be used as params.\n    */\n\n    function moveTo$1(sectionAnchor, slideAnchor) {\n      var destiny = getSectionByAnchor(sectionAnchor);\n\n      if (typeof slideAnchor !== 'undefined') {\n        scrollPageAndSlide(sectionAnchor, slideAnchor);\n      } else if (destiny != null) {\n        scrollPage(destiny);\n      }\n    }\n\n    //@ts-check\n    var g_controlPressed;\n    var g_keydownId;\n    var g_elToFocus;\n    EventEmitter.on(events.bindEvents, bindEvents$8);\n\n    function bindEvents$8() {\n      //when opening a new tab (ctrl + t), `control` won't be pressed when coming back.\n      windowAddEvent('blur', blurHandler); //Sliding with arrow keys, both, vertical and horizontal\n\n      docAddEvent('keydown', keydownHandler); //to prevent scrolling while zooming\n\n      docAddEvent('keyup', keyUpHandler);\n      EventEmitter.on(events.onDestroy, onDestroy$5);\n      EventEmitter.on(events.afterSlideLoads, onAfterSlideLoads);\n      EventEmitter.on(events.afterSectionLoads, afterSectionLoads);\n    }\n\n    function onDestroy$5() {\n      clearTimeout(g_keydownId);\n      docRemoveEvent('keydown', keydownHandler);\n      docRemoveEvent('keyup', keyUpHandler);\n    } //Sliding with arrow keys, both, vertical and horizontal\n\n\n    function keydownHandler(e) {\n      clearTimeout(g_keydownId);\n      var keyCode = e.keyCode;\n      var isPressingHorizontalArrows = [37, 39].indexOf(keyCode) > -1;\n      var canScrollWithKeyboard = getOptions().autoScrolling || getOptions().fitToSection || isPressingHorizontalArrows; //tab?\n\n      if (keyCode === 9) {\n        onTab(e);\n      } else if (!isInsideInput() && getOptions().keyboardScrolling && canScrollWithKeyboard) {\n        g_controlPressed = e.ctrlKey;\n        g_keydownId = setTimeout(function () {\n          onkeydown(e);\n        }, 0);\n      }\n    }\n    /**\n    * Keydown event\n    */\n\n\n    function onkeydown(e) {\n      var shiftPressed = e.shiftKey;\n      var activeElement = doc.activeElement;\n      var isMediaFocused = matches(activeElement, 'video') || matches(activeElement, 'audio');\n      var isScrolled = {\n        up: scrollOverflowHandler.isScrolled('up', getState().activeSection.item),\n        down: scrollOverflowHandler.isScrolled('down', getState().activeSection.item)\n      };\n      var isUsingHorizontalArrowKeys = [37, 39].indexOf(e.keyCode) > -1;\n      cancelDirectionKeyEvents(e); //do nothing if we can not scroll or we are not using horizotnal key arrows.\n\n      if (!state.canScroll && !isUsingHorizontalArrowKeys) {\n        return;\n      }\n\n      setState({\n        scrollTrigger: 'keydown'\n      });\n\n      switch (e.keyCode) {\n        //up\n        case 38:\n        case 33:\n          if (getIsScrollAllowed().k.up && isScrolled.up) {\n            if (state.isBeyondFullpage) {\n              EventEmitter.emit(events.onKeyDown, {\n                e: e\n              });\n            } else {\n              moveSectionUp();\n            }\n          } else {\n            scrollOverflowHandler.focusScrollable();\n          }\n\n          break;\n        //down\n\n        case 32:\n          //spacebar\n          if (shiftPressed && getIsScrollAllowed().k.up && !isMediaFocused && isScrolled.up) {\n            moveSectionUp();\n            break;\n          }\n\n        /* falls through */\n\n        case 40:\n        case 34:\n          if (getIsScrollAllowed().k.down && isScrolled.down) {\n            if (state.isBeyondFullpage) {\n              return;\n            } // space bar?\n\n\n            if (e.keyCode !== 32 || !isMediaFocused) {\n              moveSectionDown();\n            }\n          } else {\n            scrollOverflowHandler.focusScrollable();\n          }\n\n          break;\n        //Home\n\n        case 36:\n          if (getIsScrollAllowed().k.up) {\n            moveTo$1(1);\n          }\n\n          break;\n        //End\n\n        case 35:\n          if (getIsScrollAllowed().k.down) {\n            moveTo$1(getState().sections.length);\n          }\n\n          break;\n        //left\n\n        case 37:\n          if (getIsScrollAllowed().k.left) {\n            if (getOptions().rtl) {\n              moveSlideRight();\n            } else {\n              moveSlideLeft();\n            }\n          }\n\n          break;\n        //right\n\n        case 39:\n          if (getIsScrollAllowed().k.right) {\n            if (getOptions().rtl) {\n              moveSlideLeft();\n            } else {\n              moveSlideRight();\n            }\n          }\n\n          break;\n\n        default:\n          return;\n        // exit this handler for other keys\n      }\n    } //to prevent scrolling while zooming\n\n\n    function keyUpHandler(e) {\n      if (state.isWindowFocused) {\n        //the keyup gets fired on new tab ctrl + t in Firefox\n        g_controlPressed = e.ctrlKey;\n      }\n    } //when opening a new tab (ctrl + t), `control` won't be pressed when coming back.\n\n\n    function blurHandler() {\n      setState({\n        isWindowFocused: false\n      });\n      g_controlPressed = false;\n    }\n    /**\n    * Makes sure the tab key will only focus elements within the current section/slide\n    * preventing this way from breaking the page.\n    * Based on \"Modals and keyboard traps\"\n    * from https://developers.google.com/web/fundamentals/accessibility/focus/using-tabindex\n    */\n\n\n    function onTab(e) {\n      var isShiftPressed = e.shiftKey;\n      var activeElement = doc.activeElement;\n      var focusableElements = getFocusables(getSlideOrSection(getState().activeSection.item));\n\n      function preventAndFocusFirst(e) {\n        preventDefault(e);\n        return focusableElements[0] ? focusableElements[0].focus() : null;\n      } // deactivating tab while scrolling #4550\n\n\n      if (!state.canScroll) {\n        preventDefault(e);\n        return;\n      } //outside any section or slide? Let's not hijack the tab!\n\n\n      if (isFocusOutside(e)) {\n        return;\n      } //is there an element with focus?\n\n\n      if (activeElement) {\n        if (closest(activeElement, SECTION_ACTIVE_SEL + ',' + SECTION_ACTIVE_SEL + ' ' + SLIDE_ACTIVE_SEL) == null) {\n          activeElement = preventAndFocusFirst(e);\n        }\n      } //no element if focused? Let's focus the first one of the section/slide\n      else {\n        preventAndFocusFirst(e);\n      } //when reached the first or last focusable element of the section/slide\n      //we prevent the tab action to keep it in the last focusable element\n\n\n      var isFirstFocusableInSection = activeElement == focusableElements[0];\n      var isLastFocusableInSection = activeElement == focusableElements[focusableElements.length - 1];\n      var isNextItem = !isShiftPressed && isLastFocusableInSection;\n      var isPrevItem = isShiftPressed && isFirstFocusableInSection;\n\n      if (isPrevItem || isNextItem) {\n        preventDefault(e);\n        var focusInfo = getPanelWithFocusable(isPrevItem);\n        var destinationPanel = focusInfo ? focusInfo.panel : null;\n\n        if (destinationPanel) {\n          var destinationSection = destinationPanel.isSection ? destinationPanel : destinationPanel.parent;\n          EventEmitter.emit(events.onScrollPageAndSlide, {\n            sectionAnchor: destinationSection.index() + 1,\n            slideAnchor: destinationPanel.isSection ? 0 : destinationPanel.index()\n          });\n          g_elToFocus = focusInfo.itemToFocus;\n          preventDefault(e);\n        }\n      }\n    }\n\n    function onAfterSlideLoads(v) {\n      focusItem();\n    }\n\n    function afterSectionLoads(v) {\n      if (!closest(g_elToFocus, SLIDE_SEL) || closest(g_elToFocus, SLIDE_ACTIVE_SEL)) {\n        focusItem();\n      }\n    }\n\n    function focusItem() {\n      if (g_elToFocus) {\n        g_elToFocus.focus();\n        g_elToFocus = null;\n      }\n    }\n    /**\n     * Get's the panel containing the element to focus.\n     *\n     */\n\n\n    function getPanelWithFocusable(isPrevItem) {\n      var action = isPrevItem ? 'prevPanel' : 'nextPanel';\n      var focusableElements = [];\n      var panelWithFocusables;\n      var currentPanel = getSlideOrSectionPanel(getActivePanel()[action]());\n\n      do {\n        focusableElements = getFocusables(currentPanel.item);\n\n        if (focusableElements.length) {\n          panelWithFocusables = {\n            panel: currentPanel,\n            itemToFocus: focusableElements[isPrevItem ? focusableElements.length - 1 : 0]\n          };\n        }\n\n        currentPanel = getSlideOrSectionPanel(currentPanel[action]());\n      } while (currentPanel && focusableElements.length === 0);\n\n      return panelWithFocusables;\n    }\n    /**\n    * Gets all the focusable elements inside the passed element.\n    */\n\n\n    function getFocusables(el) {\n      return [].slice.call($(focusableElementsString, el)).filter(function (item) {\n        return getAttr(item, 'tabindex') !== '-1' && //are also not hidden elements (or with hidden parents)\n        item.offsetParent !== null;\n      });\n    }\n    /**\n    * Determines whether the focus is outside fullpage.js sections/slides or not.\n    */\n\n\n    function isFocusOutside(e) {\n      var allFocusables = getFocusables(doc);\n      var currentFocusIndex = allFocusables.indexOf(doc.activeElement);\n      var focusDestinationIndex = e.shiftKey ? currentFocusIndex - 1 : currentFocusIndex + 1;\n      var focusDestination = allFocusables[focusDestinationIndex];\n      var destinationItemSlide = closest(focusDestination, SLIDE_SEL);\n      var destinationItemSection = closest(focusDestination, SECTION_SEL);\n      return !destinationItemSlide && !destinationItemSection;\n    }\n\n    function shouldCancelKeyboardNavigation(e) {\n      // https://keycode.info/for/34\n      // 40 = arrow down\n      // 38 = arrow up\n      // 32 = spacebar\n      // 33  = PageUp\n      // 34 = PageDown\n      var keyControls = [40, 38, 32, 33, 34];\n      return keyControls.indexOf(e.keyCode) > -1 && !state.isBeyondFullpage;\n    } //preventing the scroll with arrow keys & spacebar & Page Up & Down keys\n\n\n    function cancelDirectionKeyEvents(e) {\n      if (shouldCancelKeyboardNavigation(e) && !closest(e.target, OVERFLOW_SEL)) {\n        e.preventDefault();\n      }\n    }\n\n    function getControlPressed() {\n      return g_controlPressed;\n    }\n\n    var prevTime = new Date().getTime();\n    var prevHorizontalTime = new Date().getTime();\n    var scrollings = [];\n    var horizontalScrollings = [];\n    FP.setMouseWheelScrolling = setMouseWheelScrolling;\n    /**\n    * Adds or remove the possibility of scrolling through sections by using the mouse wheel or the trackpad.\n    */\n\n    function setMouseWheelScrolling(value) {\n      if (value) {\n        addMouseWheelHandler();\n        addMiddleWheelHandler();\n      } else {\n        removeMouseWheelHandler();\n        removeMiddleWheelHandler();\n      }\n    }\n    /**\n    * Adds the auto scrolling action for the mouse wheel and trackpad.\n    * After this function is called, the mousewheel and trackpad movements will scroll through sections\n    * https://developer.mozilla.org/en-US/docs/Web/Events/wheel\n    */\n\n\n    function addMouseWheelHandler() {\n      var prefix = '';\n\n      var _addEventListener;\n\n      if (win.addEventListener) {\n        _addEventListener = \"addEventListener\";\n      } else {\n        _addEventListener = \"attachEvent\";\n        prefix = 'on';\n      } // detect available wheel event\n\n\n      var support = 'onwheel' in doc.createElement('div') ? 'wheel' : // Modern browsers support \"wheel\"\n      // @ts-ignore\n      doc.onmousewheel !== undefined ? 'mousewheel' : // Webkit and IE support at least \"mousewheel\"\n      'DOMMouseScroll'; // let's assume that remaining browsers are older Firefox\n\n      var passiveEvent = getPassiveOptionsIfPossible();\n\n      if (support == 'DOMMouseScroll') {\n        doc[_addEventListener](prefix + 'MozMousePixelScroll', MouseWheelHandler, passiveEvent);\n      } //handle MozMousePixelScroll in older Firefox\n      else {\n        doc[_addEventListener](prefix + support, MouseWheelHandler, passiveEvent);\n      }\n    }\n    /**\n    * Binding the mousemove when the mouse's middle button is pressed\n    */\n\n\n    function addMiddleWheelHandler() {\n      getContainer().addEventListener('mousedown', mouseDownHandler);\n      getContainer().addEventListener('mouseup', mouseUpHandler);\n    }\n    /**\n    * Removes the auto scrolling action fired by the mouse wheel and trackpad.\n    * After this function is called, the mousewheel and trackpad movements won't scroll through sections.\n    */\n\n\n    function removeMouseWheelHandler() {\n      if (doc.addEventListener) {\n        docRemoveEvent('mousewheel', MouseWheelHandler, false); //IE9, Chrome, Safari, Oper\n\n        docRemoveEvent('wheel', MouseWheelHandler, false); //Firefox\n\n        docRemoveEvent('MozMousePixelScroll', MouseWheelHandler, false); //old Firefox\n      } else {\n        // @ts-ignore\n        doc.detachEvent('onmousewheel', MouseWheelHandler); //IE 6/7/8\n      }\n    }\n    /**\n    * Unbinding the mousemove when the mouse's middle button is released\n    */\n\n\n    function removeMiddleWheelHandler() {\n      getContainer().removeEventListener('mousedown', mouseDownHandler);\n      getContainer().removeEventListener('mouseup', mouseUpHandler);\n    }\n    /**\n     * Determines if the wheel movement should trigger scrolling based on acceleration\n     * @param {Array} scrollings - Array of scroll values\n     * @returns {boolean} - True if accelerating\n     */\n\n\n    function isAccelerating(scrollings) {\n      var averageEnd = getAverage(scrollings, 10);\n      var averageMiddle = getAverage(scrollings, 70);\n      return averageEnd >= averageMiddle;\n    }\n    /**\n     * Detecting mousewheel scrolling\n     *\n     * http://blogs.sitepointstatic.com/examples/tech/mouse-wheel/index.html\n     * http://www.sitepoint.com/html5-javascript-mouse-wheel/\n     */\n\n\n    function MouseWheelHandler(e) {\n      var curTime = new Date().getTime();\n      var isNormalScroll = hasClass($(COMPLETELY_SEL)[0], NORMAL_SCROLL);\n      var isScrollAllowedBeyondFullPage = beyondFullPageHandler(getContainer(), e);\n\n      if (!state.isUsingWheel) {\n        setState({\n          isGrabbing: false,\n          isUsingWheel: true,\n          touchDirection: 'none'\n        });\n      }\n\n      if (isScrollAllowedBeyondFullPage) {\n        return true;\n      } else if (isScrollAllowedBeyondFullPage === false) {\n        preventDefault(e);\n        return false;\n      } //autoscrolling and not zooming?\n\n\n      if (getOptions().autoScrolling && !getControlPressed() && !isNormalScroll) {\n        // cross-browser wheel delta\n        e = e || win.event; // @ts-ignore - cross-browser compatibility\n\n        var value = e.wheelDelta || -e.deltaY || -e.detail;\n        var delta = Math.max(-1, Math.min(1, value)); // @ts-ignore - cross-browser compatibility\n\n        var horizontalValue = e.wheelDeltaX || -e.deltaX || 0; // @ts-ignore - cross-browser compatibility\n\n        var deltaY = e.deltaY || 0; // @ts-ignore - cross-browser compatibility\n\n        var deltaX = e.deltaX || 0; // Detect horizontal scrolling: SHIFT key pressed OR horizontal delta is larger than vertical\n        // @ts-ignore - cross-browser compatibility\n\n        var isShiftPressed = e.shiftKey || false;\n        var horizontalDetection = Math.abs(horizontalValue) > 0 || Math.abs(deltaX) > 0; // @ts-ignore - cross-browser compatibility\n\n        var isScrollingVertically = !isShiftPressed && (Math.abs(deltaX) < Math.abs(deltaY) || !horizontalDetection);\n        var isScrollingHorizontally = isShiftPressed || !isScrollingVertically && horizontalDetection && Math.abs(deltaX) > Math.abs(deltaY);\n        var direction = delta < 0 ? 'down' : delta > 0 ? 'up' : 'none'; // Get horizontal delta for horizontal scrolling\n        // For SHIFT+wheel, use the vertical delta as horizontal\n\n        var horizontalDelta = isShiftPressed ? delta : Math.max(-1, Math.min(1, horizontalValue));\n        var horizontalDirection = isScrollingHorizontally ? horizontalDelta < 0 ? 'right' : horizontalDelta > 0 ? 'left' : 'none' : 'none'; //is scroll allowed for the detected direction?\n\n        if (isScrollingVertically && !getIsScrollAllowed().m.down && !getIsScrollAllowed().m.up) {\n          return false;\n        }\n\n        if (isScrollingHorizontally && horizontalDirection === 'left' && !getIsScrollAllowed().m.left) {\n          return false;\n        }\n\n        if (isScrollingHorizontally && horizontalDirection === 'right' && !getIsScrollAllowed().m.right) {\n          return false;\n        } //Limiting the arrays to 150 (lets not waste memory!)\n\n\n        if (scrollings.length > 149) {\n          scrollings.shift();\n        }\n\n        if (horizontalScrollings.length > 149) {\n          horizontalScrollings.shift();\n        } //keeping record of the previous scrollings\n\n\n        if (isScrollingVertically) {\n          scrollings.push(Math.abs(value));\n        } else if (isScrollingHorizontally) {\n          // For SHIFT+wheel, use the vertical value as horizontal\n          var horizontalScrollValue = isShiftPressed ? Math.abs(value) : Math.abs(horizontalValue);\n          horizontalScrollings.push(horizontalScrollValue);\n        } //preventing to scroll the site on mouse wheel when scrollbar is present\n\n\n        if (getOptions().scrollBar || !getOptions().scrollOverflow) {\n          preventDefault(e);\n        } //time difference between the last scroll and the current one\n\n\n        var timeDiff = curTime - prevTime;\n        var horizontalTimeDiff = curTime - prevHorizontalTime;\n\n        if (isScrollingVertically) {\n          prevTime = curTime;\n        } else if (isScrollingHorizontally) {\n          prevHorizontalTime = curTime;\n        } //haven't they scrolled in a while?\n        //(enough to be consider a different scrolling action to scroll another section)\n\n\n        if (timeDiff > 200) {\n          //emptying the arrays, we dont care about old scrollings for our averages\n          scrollings = [];\n        }\n\n        if (horizontalTimeDiff > 200) {\n          horizontalScrollings = [];\n        }\n\n        setState({\n          wheelDirection: direction\n        });\n\n        if (state.canScroll) {\n          // Handle vertical scrolling\n          if (isScrollingVertically && isAccelerating(scrollings)) {\n            setState({\n              scrollTrigger: 'wheel'\n            }); //scrolling down?\n\n            if (delta < 0) {\n              scrolling('down');\n            } //scrolling up?\n            else {\n              scrolling('up');\n            }\n          } // Handle horizontal scrolling\n          // SHIFT+wheel doesn't require acceleration (intentional gesture)\n          else if (isScrollingHorizontally && (isShiftPressed || isAccelerating(horizontalScrollings))) {\n            setState({\n              scrollTrigger: 'wheel'\n            });\n\n            if (horizontalDirection === 'left') {\n              moveSlideLeft();\n            } else if (horizontalDirection === 'right') {\n              moveSlideRight();\n            }\n          }\n        }\n\n        return false;\n      }\n\n      if (getOptions().fitToSection) {\n        //stopping the auto scroll to adjust to a section\n        setState({\n          activeAnimation: false\n        });\n      }\n    } //binding the mousemove when the mouse's middle button is released\n\n\n    function mouseDownHandler(e) {\n      //middle button\n      if (e.which == 2) {\n        setOldPageY(e.pageY);\n        getContainer().addEventListener('mousemove', mouseMoveHandler);\n      }\n    } //unbinding the mousemove when the mouse's middle button is released\n\n\n    function mouseUpHandler(e) {\n      //middle button\n      if (e.which == 2) {\n        getContainer().removeEventListener('mousemove', mouseMoveHandler);\n      }\n    }\n    /**\n    * Adds or remove the mouse wheel hijacking\n    */\n\n\n    function setMouseHijack(value) {\n      if (value) {\n        setMouseWheelScrolling(true);\n        addTouchHandler();\n      } else {\n        setMouseWheelScrolling(false);\n        removeTouchHandler();\n      }\n    }\n\n    var g_canFireMouseEnterNormalScroll = true;\n    EventEmitter.on(events.bindEvents, bindEvents$7);\n\n    function bindEvents$7() {\n      /**\n      * Applying normalScroll elements.\n      * Ignoring the scrolls over the specified selectors.\n      */\n      if (getOptions().normalScrollElements) {\n        ['mouseenter', 'touchstart'].forEach(function (eventName) {\n          forMouseLeaveOrTouch(eventName, false);\n        });\n        ['mouseleave', 'touchend'].forEach(function (eventName) {\n          forMouseLeaveOrTouch(eventName, true);\n        });\n      }\n\n      EventEmitter.on(events.onDestroy, onDestroy$4);\n    }\n\n    function onDestroy$4() {\n      ['mouseenter', 'touchstart', 'mouseleave', 'touchend'].forEach(function (eventName) {\n        docRemoveEvent(eventName, onMouseEnterOrLeave, true); //true is required!\n      });\n    }\n\n    function forMouseLeaveOrTouch(eventName, allowScrolling) {\n      //a way to pass arguments to the onMouseEnterOrLeave function\n      document['fp_' + eventName] = allowScrolling;\n      docAddEvent(eventName, onMouseEnterOrLeave, true); //capturing phase\n    }\n\n    function onMouseEnterOrLeave(e) {\n      var type = e.type;\n      var isInsideOneNormalScroll = false; //onMouseLeave will use the destination target, not the one we are moving away from\n\n      var target = type === 'mouseleave' ? e.toElement || e.relatedTarget : e.target; //coming from closing a normalScrollElements modal or moving outside viewport?\n\n      if (target == document || !target) {\n        setMouseHijack(true);\n        return;\n      }\n\n      if (type === 'touchend') {\n        g_canFireMouseEnterNormalScroll = false;\n        setTimeout(function () {\n          g_canFireMouseEnterNormalScroll = true;\n        }, 800);\n      } //preventing mouseenter event to do anything when coming from a touchEnd event\n      //fixing issue #3576\n\n\n      if (type === 'mouseenter' && !g_canFireMouseEnterNormalScroll) {\n        return;\n      }\n\n      var normalSelectors = getOptions().normalScrollElements.split(',');\n      normalSelectors.forEach(function (normalSelector) {\n        if (!isInsideOneNormalScroll) {\n          var isNormalScrollTarget = matches(target, normalSelector); //leaving a child inside the normalScoll element is not leaving the normalScroll #3661\n\n          var isNormalScrollChildFocused = closest(target, normalSelector);\n\n          if (isNormalScrollTarget || isNormalScrollChildFocused) {\n            if (!FP.shared.isNormalScrollElement) {\n              setMouseHijack(false);\n            }\n\n            FP.shared.isNormalScrollElement = true;\n            isInsideOneNormalScroll = true;\n          }\n        }\n      }); //not inside a single normal scroll element anymore?\n\n      if (!isInsideOneNormalScroll && FP.shared.isNormalScrollElement) {\n        setMouseHijack(true);\n        FP.shared.isNormalScrollElement = false;\n      }\n    }\n\n    FP.silentMoveTo = silentMoveTo;\n    /**\n    * Moves the page to the given section and slide with no animation.\n    * Anchors or index positions can be used as params.\n    */\n\n    function silentMoveTo(sectionAnchor, slideAnchor) {\n      setScrollingSpeed(0, 'internal');\n      moveTo$1(sectionAnchor, slideAnchor);\n      setScrollingSpeed(getOriginals().scrollingSpeed, 'internal');\n    }\n\n    var previousHeight = getWindowHeight();\n    var windowsWidth = getWindowWidth();\n    var g_resizeId;\n    var g_isConsecutiveResize = false;\n    var g_resizeMobileHandlerId;\n    FP.reBuild = reBuild;\n    EventEmitter.on(events.bindEvents, bindEvents$6);\n\n    function bindEvents$6() {\n      // Setting VH correctly in mobile devices\n      resizeHandler(); //when resizing the site, we adjust the heights of the sections, slimScroll...\n\n      windowAddEvent('resize', resizeHandler);\n      EventEmitter.on(events.onDestroy, onDestroy$3);\n    }\n\n    function onDestroy$3() {\n      clearTimeout(g_resizeId);\n      clearTimeout(g_resizeMobileHandlerId);\n      windowRemoveEvent('resize', resizeHandler);\n    }\n    /*\n    * Resize event handler.\n    */\n\n\n    function resizeHandler() {\n      if (!g_isConsecutiveResize) {\n        if (getOptions().autoScrolling && !getOptions().scrollBar || !getOptions().fitToSection) {\n          setSectionsHeight(getWindowHeight());\n        }\n      } // we won't trigger fit to section on page load\n      // otherwise it will scroll to the worng section if using anchors #4613\n\n\n      if (state.isFullpageInitDone) {\n        fitToActiveSection();\n      }\n\n      g_isConsecutiveResize = true; //in order to call the functions only when the resize is finished\n      //http://stackoverflow.com/questions/4298612/jquery-how-to-call-resize-event-only-once-its-finished-resizing    \n\n      clearTimeout(g_resizeId);\n      g_resizeId = setTimeout(function () {\n        //issue #3336 \n        //(some apps or browsers, like Chrome/Firefox for Mobile take time to report the real height)\n        //so we check it 3 times with intervals in that case\n        // for(var i = 0; i< 4; i++){\n        resizeActions();\n        g_isConsecutiveResize = false; // }\n      }, 400);\n    }\n\n    function fitToActiveSection() {\n      if (isTouchDevice) {\n        // Issue #4393 and previously in v3, #3336\n        // (some apps or browsers, like Chrome/Firefox will delay a bit to scroll \n        // to the focused input\n        for (var i = 0; i < 4; i++) {\n          g_resizeMobileHandlerId = setTimeout(function () {\n            window.requestAnimationFrame(function () {\n              // on Android devices the browser scrolls to the focused element\n              // messing up the whole page structure. So we need to update the\n              // translate3d value when the keyboard shows/hides\n              if (getOptions().autoScrolling && !getOptions().scrollBar) {\n                setState({\n                  isResizing: true\n                });\n                silentMoveTo(state.activeSection.index() + 1);\n                setState({\n                  isResizing: false\n                });\n              }\n            });\n          }, 200 * i);\n        }\n      }\n    }\n    /**\n     * Checks if VH units need to be set based on scrolling configuration\n     */\n\n\n    function shouldSetVhUnits() {\n      return !state.isBeyondFullpage && !getOptions().autoScrolling;\n    }\n    /**\n    * When resizing the site, we adjust the heights of the sections, slimScroll...\n    */\n\n\n    function resizeActions() {\n      setState({\n        isResizing: true\n      });\n\n      if (!isTouchDevice || getOptions().adjustOnNavChange) {\n        setSectionsHeight('');\n\n        if (shouldSetVhUnits()) {\n          setVhUnits();\n        }\n      }\n\n      EventEmitter.emit(events.contentChanged);\n      updateState(); //checking if it needs to get responsive\n\n      responsive(); // rebuild immediately on touch devices\n\n      if (isTouchDevice) {\n        var activeElement = doc.activeElement; //if the keyboard is NOT visible\n\n        if (!matches(activeElement, 'textarea') && !matches(activeElement, 'input') && !matches(activeElement, 'select')) {\n          var currentHeight = getWindowHeight(); //making sure the change in the viewport size is enough to force a rebuild. (20 % of the window to avoid problems when hidding scroll bars)\n\n          if (Math.abs(currentHeight - previousHeight) > 20 * Math.max(previousHeight, currentHeight) / 100) {\n            reBuild(true);\n            previousHeight = currentHeight;\n          }\n        }\n      } else {\n        adjustToNewViewport();\n      }\n\n      setState({\n        isResizing: false\n      });\n    }\n    /**\n     * When resizing is finished, we adjust the slides sizes and positions\n     */\n\n\n    function reBuild(resizing) {\n      if (hasClass(getContainer(), DESTROYED)) {\n        return;\n      } //nothing to do if the plugin was destroyed\n      //updating global vars\n\n\n      setState({\n        isResizing: true,\n        windowsHeight: getWindowHeight(),\n        windowsWidth: getWindowWidth()\n      });\n      var sections = getState().sections;\n\n      for (var i = 0; i < sections.length; ++i) {\n        var section = sections[i];\n        var slidesWrap = $(SLIDES_WRAPPER_SEL, section.item)[0];\n        var slides = section.slides; //adjusting the position fo the FULL WIDTH slides...\n\n        if (slides.length > 1) {\n          landscapeScroll(slidesWrap, section.activeSlide.item);\n        }\n      }\n\n      if (getOptions().scrollOverflow) {\n        scrollOverflowHandler.makeScrollable();\n      }\n\n      var sectionIndex = getState().activeSection.index();\n\n      if (!state.isBeyondFullpage) {\n        //isn't it the first section?\n        if (sectionIndex) {\n          //adjusting the position for the current section\n          silentMoveTo(sectionIndex + 1);\n        }\n      }\n\n      setState({\n        isResizing: false\n      });\n\n      if (isFunction(getOptions().afterResize) && resizing) {\n        getOptions().afterResize.call(getContainer(), win.innerWidth, win.innerHeight);\n      }\n\n      if (isFunction(getOptions().afterReBuild) && !resizing) {\n        getOptions().afterReBuild.call(getContainer());\n      }\n\n      trigger(getContainer(), 'afterRebuild');\n    }\n    /**\n    * Adjusts a section to the viewport if it has changed.\n    */\n\n\n    function adjustToNewViewport() {\n      var newWindowHeight = getWindowHeight();\n      var newWindowWidth = getWindowWidth();\n\n      if (state.windowsHeight !== newWindowHeight || windowsWidth !== newWindowWidth) {\n        setState({\n          windowsHeight: newWindowHeight\n        });\n        windowsWidth = newWindowWidth;\n        reBuild(true);\n      }\n    }\n\n    function setSectionsHeight(value) {\n      var propertyValue = value === '' ? '' : value + 'px';\n      getState().sections.forEach(function (section) {\n        css(section.item, {\n          'height': propertyValue\n        });\n      });\n    }\n    /**\n     * Defining the value in px of a VH unit. (Used for autoScrolling: false)\n     * To fix the height issue on mobile devices when using VH units.\n     * https://css-tricks.com/the-trick-to-viewport-units-on-mobile/\n     */\n\n\n    function setVhUnits() {\n      // First we get the viewport height and we multiple it by 1% to get a value for a vh unit\n      var vh = win.innerHeight * 0.01; // Then we set the value in the --vh custom property to the root of the document\n\n      doc.documentElement.style.setProperty('--vh', \"\".concat(vh, \"px\"));\n    }\n\n    function getAnchorsURL() {\n      var section;\n      var slide;\n      var hash = win.location.hash;\n\n      if (hash.length) {\n        //getting the anchor link in the URL and deleting the `#`\n        var anchorsParts = hash.replace('#', '').split('/'); //using / for visual reasons and not as a section/slide separator #2803\n\n        var isFunkyAnchor = hash.indexOf('#/') > -1;\n        section = isFunkyAnchor ? '/' + anchorsParts[1] : decodeURIComponent(anchorsParts[0]);\n        var slideAnchor = isFunkyAnchor ? anchorsParts[2] : anchorsParts[1];\n\n        if (slideAnchor && slideAnchor.length) {\n          slide = decodeURIComponent(slideAnchor);\n        }\n      }\n\n      return {\n        section: section,\n        slide: slide\n      };\n    }\n\n    FP.setLockAnchors = setLockAnchors;\n    EventEmitter.on(events.bindEvents, bindEvents$5);\n\n    function bindEvents$5() {\n      //detecting any change on the URL to scroll to the given anchor link\n      //(a way to detect back history button as we play with the hashes on the URL)\n      windowAddEvent('hashchange', hashChangeHandler); // Handle clicks on anchor links that point to elements within sections/slides\n\n      docAddEvent('click', anchorLinkClickHandler);\n      EventEmitter.on(events.onDestroy, onDestroy$2);\n    }\n\n    function onDestroy$2() {\n      windowRemoveEvent('hashchange', hashChangeHandler);\n      docRemoveEvent('click', anchorLinkClickHandler);\n    }\n    /**\n    * Sets lockAnchors\n    */\n\n\n    function setLockAnchors(value) {\n      getOptions().lockAnchors = value;\n    }\n    /**\n    * Detecting any change on the URL to scroll to the given anchor link\n    * (a way to detect back history button as we play with the hashes on the URL)\n    */\n\n\n    function hashChangeHandler() {\n      if (!state.isScrolling && !getOptions().lockAnchors) {\n        var anchors = getAnchorsURL();\n        var sectionAnchor = anchors.section;\n        var slideAnchor = anchors.slide; //when moving to a slide in the first section for the first time (first time to add an anchor to the URL)\n\n        var isFirstSlideMove = typeof state.lastScrolledDestiny === 'undefined';\n        var isFirstScrollMove = typeof state.lastScrolledDestiny === 'undefined' && typeof slideAnchor === 'undefined' && !state.slideMoving;\n\n        if (sectionAnchor && sectionAnchor.length) {\n          /*in order to call scrollpage() only once for each destination at a time\n          It is called twice for each scroll otherwise, as in case of using anchorlinks `hashChange`\n          event is fired on every scroll too.*/\n          if (sectionAnchor && sectionAnchor !== state.lastScrolledDestiny && !isFirstSlideMove || isFirstScrollMove || !state.slideMoving && state.lastScrolledSlide != slideAnchor) {\n            EventEmitter.emit(events.onScrollPageAndSlide, {\n              sectionAnchor: sectionAnchor,\n              slideAnchor: slideAnchor\n            });\n          }\n        }\n      }\n    }\n    /**\n    * Handles clicks on anchor links (a[href^=\"#\"]) that point to elements within \n    * sections/slides.\n    * This allows navigation to specific elements within sections/slides.\n    */\n\n\n    function anchorLinkClickHandler(e) {\n      var target = e.target; // Check if the clicked element is an anchor link or is inside one\n\n      var link = closest(target, 'a[href^=\"#\"]');\n      if (!link) return;\n      var href = getAttr(link, 'href');\n      if (!href || href === '#') return; // Get the target element from the href\n\n      var targetElement = $(href)[0];\n      if (!targetElement) return; // Only handle links within the fullPage container\n\n      var container = getContainer();\n\n      if (!container || !container.contains(targetElement)) {\n        return;\n      }\n\n      var sectionEl = closest(targetElement, getOptions().sectionSelector);\n\n      if (!sectionEl) {\n        return;\n      }\n\n      var section = getPanelByElement(state.sections, sectionEl);\n\n      if (!section) {\n        return;\n      }\n\n      var slideEl = closest(targetElement, getOptions().slideSelector);\n      var slide = slideEl && sectionEl.contains(slideEl) ? getPanelByElement(section.slides, slideEl) : null; // Prevent default browser scroll behavior\n\n      preventDefault(e);\n      moveTo$1(section.index() + 1, slide ? slide.index() : null);\n      var scrollable = $(OVERFLOW_SEL, slide ? slide.item : section.item)[0];\n\n      if (scrollable) {\n        scrollable.scrollTo(0, targetElement.offsetTop);\n      }\n    }\n\n    EventEmitter.on(events.bindEvents, bindEvents$4);\n\n    function bindEvents$4() {\n      docAddEvent('wheel', wheelDataHandler.registerEvent, getPassiveOptionsIfPossible());\n      EventEmitter.on(events.scrollBeyondFullpage, scrollBeyondFullPage);\n      EventEmitter.on(events.onKeyDown, onKeyDown);\n    }\n\n    EventEmitter.on(events.bindEvents, bindEvents$3);\n\n    function bindEvents$3() {\n      EventEmitter.on(events.onClickOrTouch, onClickOrTouch$1);\n    }\n\n    function onClickOrTouch$1(params) {\n      var target = params.target;\n\n      if (closest(target, getOptions().menu + ' [data-menuanchor]')) {\n        menuItemsHandler.call(target, params.e);\n      }\n    } //Menu item handler when not using anchors or using lockAnchors:true\n\n\n    function menuItemsHandler(e) {\n      setState({\n        scrollTrigger: 'menu'\n      });\n\n      if ($(getOptions().menu)[0] && (getOptions().lockAnchors || !getOptions().anchors.length)) {\n        preventDefault(e);\n        var menuAnchorEl = closest(this, '[data-menuanchor]');\n        /*jshint validthis:true */\n\n        EventEmitter.emit(events.onMenuClick, {\n          anchor: getAttr(menuAnchorEl, 'data-menuanchor')\n        });\n      }\n    }\n\n    EventEmitter.on(events.bindEvents, bindEvents$2);\n\n    function bindEvents$2() {\n      EventEmitter.on(events.onClickOrTouch, onClickOrTouch);\n    }\n\n    function onClickOrTouch(params) {\n      var target = params.target;\n\n      if (target && closest(target, SECTION_NAV_SEL + ' a')) {\n        sectionBulletHandler.call(target, params.e);\n      } else if (matches(target, SECTION_NAV_TOOLTIP_SEL)) {\n        tooltipTextHandler.call(target);\n      } else if (matches(target, SLIDES_NAV_LINK_SEL) || closest(target, SLIDES_NAV_LINK_SEL) != null) {\n        slideBulletHandler.call(target, params.e);\n      }\n    }\n\n    var lastScroll = 0;\n    var g_scrollId;\n    var g_scrollId2;\n    EventEmitter.on(events.onDestroy, onDestroy$1); //when scrolling...\n\n    function scrollHandler(e) {\n      var currentSection;\n      var currentSectionElem;\n\n      if (state.isResizing || !getState().activeSection) {\n        return;\n      }\n\n      getLast(getState().sections);\n\n      if (getState().isBeyondFullpage || getState().isAboutToScrollToFullPage) {\n        return;\n      }\n\n      if (!getOptions().autoScrolling || getOptions().scrollBar) {\n        var currentScroll = getScrollTop();\n        var scrollDirection = getScrollDirection(currentScroll);\n        var visibleSectionIndex = 0;\n        var screen_mid = currentScroll + getWindowHeight() / 2.0;\n        var isAtBottom = $body.scrollHeight - getWindowHeight() === currentScroll;\n        var sections = getState().sections;\n        setState({\n          scrollY: currentScroll\n        }); //when using `auto-height` for a small last section it won't be centered in the viewport\n\n        if (isAtBottom) {\n          visibleSectionIndex = sections.length - 1;\n        } //is at top? when using `auto-height` for a small first section it won't be centered in the viewport\n        else if (!currentScroll) {\n          visibleSectionIndex = 0;\n        } //taking the section which is showing more content in the viewport\n        else {\n          for (var i = 0; i < sections.length; ++i) {\n            var section = sections[i].item; // Pick the the last section which passes the middle line of the screen.\n\n            if (section.offsetTop <= screen_mid) {\n              visibleSectionIndex = i;\n            }\n          }\n        }\n\n        if (isCompletelyInViewPort(scrollDirection)) {\n          if (!hasClass(getState().activeSection.item, COMPLETELY)) {\n            addClass(getState().activeSection.item, COMPLETELY);\n            removeClass(siblings(getState().activeSection.item), COMPLETELY);\n          }\n        } //geting the last one, the current one on the screen\n\n\n        currentSection = sections[visibleSectionIndex];\n        currentSectionElem = currentSection.item; //setting the visible section as active when manually scrolling\n        //executing only once the first time we reach the section\n\n        if (!currentSection.isActive) {\n          setState({\n            isScrolling: true\n          });\n          var leavingSection = getState().activeSection.item;\n          var leavingSectionIndex = getState().activeSection.index() + 1;\n          var yMovement = getYmovement(getState().activeSection, currentSectionElem);\n          var anchorLink = currentSection.anchor;\n          var sectionIndex = currentSection.index() + 1;\n          var activeSlide = currentSection.activeSlide;\n          var slideIndex;\n          var slideAnchorLink;\n          var callbacksParams = {\n            activeSection: leavingSection,\n            sectionIndex: sectionIndex - 1,\n            anchorLink: anchorLink,\n            element: currentSectionElem,\n            leavingSection: leavingSectionIndex,\n            direction: yMovement,\n            items: {\n              origin: getState().activeSection,\n              destination: currentSection\n            }\n          };\n\n          if (activeSlide) {\n            slideAnchorLink = activeSlide.anchor;\n            slideIndex = activeSlide.index();\n          }\n\n          if (state.canScroll) {\n            addClass(currentSectionElem, ACTIVE);\n            removeClass(siblings(currentSectionElem), ACTIVE);\n\n            if (isFunction(getOptions().beforeLeave)) {\n              fireCallbackOncePerScroll('beforeLeave', callbacksParams);\n            }\n\n            if (isFunction(getOptions().onLeave)) {\n              fireCallback('onLeave', callbacksParams);\n            }\n\n            if (isFunction(getOptions().afterLoad)) {\n              fireCallback('afterLoad', callbacksParams);\n            }\n\n            stopMedia(leavingSection);\n            lazyLoadPanels(currentSection);\n            playMedia(currentSectionElem);\n            activateMenuAndNav(anchorLink, sectionIndex - 1);\n\n            if (getOptions().anchors.length) {\n              //needed to enter in hashChange event when using the menu with anchor links\n              setState({\n                lastScrolledDestiny: anchorLink\n              });\n            }\n\n            updateState();\n            setPageStatus(slideIndex, slideAnchorLink, anchorLink);\n          } //small timeout in order to avoid entering in hashChange event when scrolling is not finished yet\n\n\n          clearTimeout(g_scrollId);\n          g_scrollId = setTimeout(function () {\n            setState({\n              isScrolling: false\n            });\n          }, 100);\n        }\n\n        if (getOptions().fitToSection && state.canScroll) {\n          clearTimeout(g_scrollId2);\n          g_scrollId2 = setTimeout(function () {\n            var fixedSections = state.sections.filter(function (section) {\n              var sectionValues = section.item.getBoundingClientRect();\n              return Math.round(sectionValues.bottom) === Math.round(getWindowHeight()) || Math.round(sectionValues.top) === 0;\n            }); // No section is fitting the viewport? Let's fix that!\n\n            if (!fixedSections.length) {\n              if (isTouchDevice && isFormElementFocused()) {\n                // Exit early to avoid fixing the section while interacting with form elements\n                return;\n              } else {\n                fitToSection();\n              }\n            }\n          }, getOptions().fitToSectionDelay);\n        }\n      }\n    }\n\n    function isFormElementFocused() {\n      var focusedElement = document.activeElement;\n      if (!focusedElement) return false; // Include only elements that trigger the keyboard on mobile\n\n      return focusedElement.matches('input, textarea');\n    }\n\n    function onDestroy$1() {\n      clearTimeout(g_scrollId);\n      clearTimeout(g_scrollId2);\n    }\n    /**\n    * Gets the directon of the the scrolling fired by the scroll event.\n    */\n\n\n    function getScrollDirection(currentScroll) {\n      var direction = currentScroll > lastScroll ? 'down' : 'up';\n      lastScroll = currentScroll; //needed for auto-height sections to determine if we want to scroll to the top or bottom of the destination\n\n      setState({\n        previousDestTop: currentScroll\n      });\n      return direction;\n    }\n    /**\n    * Determines whether the active section has seen in its whole or not.\n    */\n\n\n    function isCompletelyInViewPort(movement) {\n      var top = getState().activeSection.item.offsetTop;\n      var bottom = top + getWindowHeight();\n\n      if (movement == 'up') {\n        return bottom >= getScrollTop() + getWindowHeight();\n      }\n\n      return top <= getScrollTop();\n    }\n\n    EventEmitter.on(events.bindEvents, bindEvents$1);\n    EventEmitter.on(events.onDestroy, onDestroy);\n\n    function onDestroy() {\n      windowRemoveEvent('scroll', scrollHandler);\n    }\n\n    function bindEvents$1() {\n      windowAddEvent('scroll', scrollHandler);\n      doc.body.addEventListener('scroll', scrollHandler);\n      EventEmitter.on(events.onScrollPageAndSlide, function (params) {\n        scrollPageAndSlide(params.sectionAnchor, params.slideAnchor);\n      });\n      EventEmitter.on(events.onMenuClick, function (params) {\n        moveTo$1(params.anchor, undefined);\n      });\n      EventEmitter.on(events.onScrollOverflowScrolled, function (params) {\n        var scrollSection = params.direction === 'down' ? moveSectionDown : moveSectionUp;\n        scrollSection();\n      });\n      EventEmitter.on(events.scrollPage, function (params) {\n        scrollPage(params.destination);\n      });\n    }\n\n    FP.getActiveSlide = getActiveSlide;\n\n    FP.getScrollX = function () {\n      return state.scrollX;\n    };\n\n    EventEmitter.on(events.bindEvents, bindEvents);\n\n    function bindEvents() {\n      EventEmitter.on(events.onDestroy, onDestroy$6);\n      EventEmitter.on(events.landscapeScroll, function (params) {\n        landscapeScroll(params.slides, params.destination);\n      });\n      EventEmitter.on(events.moveSlideRight, function (params) {\n        moveSlideRight(params.section);\n      });\n      EventEmitter.on(events.moveSlideLeft, function (params) {\n        moveSlideLeft(params.section);\n      });\n      EventEmitter.on(events.afterSectionLoads, updateScrollX);\n    }\n\n    function updateScrollX(params) {\n      var activeSlide = params.items.destination.activeSlide;\n      var scrollX = activeSlide ? Math.round(activeSlide.offsetLeft) : 0;\n      setState({\n        scrollX: scrollX\n      });\n    }\n    /**\n    * Gets the active slide.\n    */\n\n\n    function getActiveSlide() {\n      return nullOrSlide(getState().activeSection.activeSlide);\n    }\n\n    EventEmitter.on(events.bindEvents, init$1);\n\n    function init$1() {\n      var position = getOptions().credits.position || 'right';\n      var positionStyle = ['left', 'right'].indexOf(position) > -1 ? \"\".concat(position, \": 0;\") : '';\n      var waterMark = \"\\n        <div class=\\\"\".concat(WATERMARK, \"\\\" style=\\\"\").concat(positionStyle, \"\\\">\\n            <a href=\\\"https://alvarotrigo.com/fullPage/\\\" \\n                rel=\\\"nofollow noopener\\\" \\n                target=\\\"_blank\\\" \\n                style=\\\"text-decoration:none; color: #000;\\\">\\n                    \").concat(getOptions().credits.label || 'Made with fullPage.js', \"\\n            </a>\\n        </div>\\n    \");\n      var lastSection = getLast(state.sections);\n      var shouldUseWaterMark = !state.isValid || getOptions().credits.enabled;\n\n      if (lastSection && lastSection.item && shouldUseWaterMark) {\n        lastSection.item.insertAdjacentHTML('beforeend', waterMark);\n      }\n    }\n\n    !function () {\n      EventEmitter.on(events.onInitialise, function () {\n        var n, a, l;\n        setState({\n          isValid: (getOptions().licenseKey, n = getOptions().licenseKey, a = function (n) {\n            var e = parseInt(\"\\x35\\x31\\x34\").toString(16);\n            if (!n || n.length < 29 || 4 === n.split(t[0]).length) return null;\n            var r = [\"\\x45\\x61\\x63\\x68\", \"\\x66\\x6f\\x72\"][i()]().join(\"\"),\n                a = n[[\"\\x73\\x70\\x6c\\x69\\x74\"]](\"-\"),\n                l = [];\n            a[r](function (t, n) {\n              if (n < 4) {\n                var r = function (t) {\n                  var n = t[t.length - 1],\n                      e = [\"\\x4e\\x61\\x4e\", \"\\x69\\x73\"][i()]().join(\"\");\n                  return window[e](n) ? o(n) : function (t) {\n                    return t - ACTIVE.length;\n                  }(n);\n                }(t);\n\n                l.push(r);\n                var s = o(t[r]);\n\n                if (1 === n) {\n                  var a = [\"\\x70\\x61\", \"\\x64\\x53\", \"\\x74\", \"\\x61\\x72\\x74\"].join(\"\");\n                  s = s.toString()[a](2, \"0\");\n                }\n\n                e += s, 0 !== n && 1 !== n || (e += \"-\");\n              }\n            });\n            var f = 0,\n                m = \"\";\n            return n.split(\"-\").forEach(function (t, n) {\n              if (n < 4) {\n                var _i = 0;\n\n                for (var e = 0; e < 4; e++) {\n                  e !== l[n] && (_i += Math.abs(o(t[e])), isNaN(t[e]) || f++);\n                }\n\n                var r = s(_i);\n                m += r;\n              }\n            }), m += s(f), {\n              v: new Date(e + \"T00:00\"),\n              o: e.split(\"-\")[2] === 8 * (ACTIVE.length - 2) + \"\",\n              l: m\n            };\n          }(n), l = function (t) {\n            var n = r[i()]().join(\"\");\n            return t && 0 === n.indexOf(t) && t.length === n.length;\n          }(n) || function (t) {\n            return new RegExp(\"^(?=.*?[A-Y])(?=.*?[a-y])(?=.*?[0-8])(?=.*?[#?!@$%^&*-]).{8,}$\").test(t);\n          }(n), (a || l) && (a && e <= a.v && a.l === n.split(t[0])[4] || l || a.o) || !1)\n        });\n      });\n      var t = [\"-\"];\n      var n = \"\\x32\\x30\\x32\\x36\\x2d\\x32\\x2d\\x34\".split(\"-\"),\n          e = new Date(n[0], n[1], n[2]),\n          r = [\"se\", \"licen\", \"-\", \"v3\", \"l\", \"gp\"];\n\n      function i() {\n        return [[\"\\x72\\x65\", \"\\x76\\x65\\x72\\x73\\x65\"].join(\"\")][\"\".length];\n      }\n\n      function o(t) {\n        return t ? isNaN(t) ? t.charCodeAt(0) - 72 : t : \"\";\n      }\n\n      function s(t) {\n        var n = 72 + t;\n        return n > 90 && n < 97 && (n += 15), String.fromCharCode(n).toUpperCase();\n      }\n    }();\n\n    EventEmitter.on(events.onPerformMovement, onSlideOrScroll);\n    EventEmitter.on(events.afterSectionLoads, afterPanelLoad);\n    EventEmitter.on(events.onSlideLeave, onSlideOrScroll);\n    EventEmitter.on(events.afterSlideLoads, afterPanelLoad);\n\n    function onSlideOrScroll(params) {\n      var skipValue = getOptions().skipIntermediateItems;\n      var scrollType = params.items.origin.isSection ? 'sections' : 'slides';\n      var areConsecutivePanels = Math.abs(params.items.origin.index() - params.items.destination.index()) > 1;\n      var doesApply = (skipValue === true || skipValue === scrollType) && areConsecutivePanels;\n\n      if (doesApply) {\n        setScrollingSpeed(0, 'internal');\n      }\n    }\n\n    function afterPanelLoad(params) {\n      if (getOptions().skipIntermediateItems) {\n        setVariableState('scrollingSpeed', getOriginals().scrollingSpeed, 'internal');\n      }\n    }\n\n    //@ts-check\n    EventEmitter.on(events.beforeInit, beforeInit);\n    FP.setKeyboardScrolling = setKeyboardScrolling;\n\n    function beforeInit() {\n      setKeyboardScrolling(getOptions().keyboardScrolling);\n    }\n    /**\n    * Adds or remove the possibility of scrolling through sections by using the keyboard arrow keys\n    */\n\n\n    function setKeyboardScrolling(value, directions) {\n      if (typeof directions !== 'undefined') {\n        directions = directions.replace(/ /g, '').split(',');\n        directions.forEach(function (direction) {\n          setIsScrollAllowed(value, direction, 'k');\n        });\n      } else {\n        setIsScrollAllowed(value, 'all', 'k');\n        getOptions().keyboardScrolling = value;\n      }\n    }\n\n    /**\n    * Sets the data-anchor attributes to the menu elements and activates the current one.\n    */\n\n    function styleMenu(section) {\n      var index = section.index();\n\n      if (typeof getOptions().anchors[index] !== 'undefined') {\n        //activating the menu / nav element on load\n        if (section.isActive) {\n          activateMenuAndNav(getOptions().anchors[index], index);\n        }\n      } //moving the menu outside the main container if it is inside (avoid problems with fixed positions when using CSS3 tranforms)\n\n\n      if (getOptions().menu && getOptions().css3 && closest($(getOptions().menu)[0], WRAPPER_SEL) != null) {\n        $(getOptions().menu).forEach(function (menu) {\n          $body.appendChild(menu);\n        });\n      }\n    }\n\n    /**\n    * Works over the DOM structure to set it up for the current fullpage getOptions().\n    */\n\n    function prepareDom() {\n      css(getParentsUntil(getContainer(), 'body'), {\n        'height': '100%',\n        'position': 'relative'\n      }); //adding a class to recognize the container internally in the code\n\n      addClass(getContainer(), WRAPPER);\n      addClass($html, ENABLED); //due to https://github.com/alvarotrigo/fullPage.js/issues/1502\n\n      setState({\n        windowsHeight: getWindowHeight()\n      });\n      removeClass(getContainer(), DESTROYED); //in case it was destroyed before initializing it again\n\n      addInternalSelectors();\n      var sections = getState().sectionsIncludingHidden; //styling the sections / slides / menu\n\n      for (var i = 0; i < sections.length; i++) {\n        var section = sections[i];\n        var slides = section.allSlidesItems; //caching the original styles to add them back on destroy('all')\n\n        var originalStyles = getAttr(section.item, 'style');\n\n        if (originalStyles) {\n          section.item.setAttribute('data-fp-styles', originalStyles);\n        }\n\n        styleSection(section);\n        styleMenu(section); // if there's any slide\n\n        if (slides.length > 0) {\n          styleSlides(section);\n        }\n      } //fixed elements need to be moved out of the plugin container due to problems with CSS3.\n\n\n      if (getOptions().fixedElements && getOptions().css3) {\n        $(getOptions().fixedElements).forEach(function (item) {\n          $body.appendChild(item);\n        });\n      } //vertical centered of the navigation + active bullet\n\n\n      if (getOptions().navigation) {\n        addVerticalNavigation();\n      }\n\n      enableYoutubeAPI();\n\n      if (getOptions().scrollOverflow) {\n        scrollOverflowHandler.makeScrollable();\n      }\n    }\n\n    FP.shared.afterRenderActions = afterRenderActions;\n    /**\n    * Actions and callbacks to fire afterRender\n    */\n\n    function afterRenderActions() {\n      var section = getState().activeSection;\n      var sectionElem = getState().activeSection.item;\n      addClass(sectionElem, COMPLETELY);\n      lazyLoadPanels(getState().activeSection);\n      lazyLoadOthers();\n      playMedia(sectionElem);\n\n      if (isDestinyTheStartingSection() && isFunction(getOptions().afterLoad)) {\n        fireCallback('afterLoad', {\n          activeSection: sectionElem,\n          element: sectionElem,\n          direction: null,\n          //for backwards compatibility callback (to be removed in a future!)\n          anchorLink: section.anchor,\n          sectionIndex: section.index(),\n          items: {\n            origin: getState().activeSection,\n            destination: getState().activeSection\n          }\n        });\n      }\n\n      if (isFunction(getOptions().afterRender)) {\n        fireCallback('afterRender');\n      }\n    }\n    /**\n    * Determines if the URL anchor destiny is the starting section (the one using 'active' class before initialization)\n    */\n\n    function isDestinyTheStartingSection() {\n      var anchor = getAnchorsURL();\n      var destinationSection = getSectionByAnchor(anchor.section);\n      return !anchor.section || !destinationSection || typeof destinationSection !== 'undefined' && destinationSection.index() === index(getStartingSection());\n    }\n\n    FP.setAllowScrolling = setAllowScrolling;\n    /**\n    * Adds or remove the possibility of scrolling through sections by using the mouse wheel/trackpad or touch gestures.\n    * Optionally a second parameter can be used to specify the direction for which the action will be applied.\n    *\n    * @param directions string containing the direction or directions separated by comma.\n    */\n\n    function setAllowScrolling(value, directions) {\n      if (typeof directions !== 'undefined') {\n        directions = directions.replace(/ /g, '').split(',');\n        directions.forEach(function (direction) {\n          setIsScrollAllowed(value, direction, 'm');\n        });\n      } else {\n        setIsScrollAllowed(value, 'all', 'm');\n      }\n    }\n\n    /**\n    * Scrolls to the anchor in the URL when loading the site\n    */\n\n    function scrollToAnchor() {\n      var anchors = getAnchorsURL();\n      var sectionAnchor = anchors.section;\n      var slideAnchor = anchors.slide;\n\n      if (sectionAnchor) {\n        //if theres any #\n        if (getOptions().animateAnchor) {\n          scrollPageAndSlide(sectionAnchor, slideAnchor);\n        } else {\n          silentMoveTo(sectionAnchor, slideAnchor);\n        }\n      } else {\n        EventEmitter.emit(events.onAfterRenderNoAnchor, null);\n      }\n    }\n\n    /*\n    * Removes inline styles added by fullpage.js\n    */\n\n    function destroyStructure() {\n      //reseting the `top` or `translate` properties to 0\n      silentScroll(0); //loading all the lazy load content\n\n      $('img[data-src], source[data-src], audio[data-src], iframe[data-src]', getContainer()).forEach(function (item) {\n        setSrc(item, 'src');\n      });\n      $('img[data-srcset]').forEach(function (item) {\n        setSrc(item, 'srcset');\n      });\n      remove($(SECTION_NAV_SEL + ', ' + SLIDES_NAV_SEL + ', ' + SLIDES_ARROW_SEL + ', ' + WATERMARK_SEL)); //removing inline styles\n\n      css(getNodes(getState().sections), {\n        'height': '',\n        'background-color': '',\n        'padding': ''\n      });\n      css(getNodes(getState().slides), {\n        'width': ''\n      });\n      css(getContainer(), {\n        'height': '',\n        'position': '',\n        '-ms-touch-action': '',\n        'touch-action': ''\n      });\n      css($htmlBody, {\n        'overflow': '',\n        'height': ''\n      }); // remove .fp-enabled class\n\n      removeClass($html, ENABLED); // remove .fp-responsive class & .fp-scrollable\n\n      removeClass($body, RESPONSIVE + ' ' + SCROLLABLE); // remove all of the .fp-viewing- classes\n\n      $body.className.split(/\\s+/).forEach(function (className) {\n        if (className.indexOf(VIEWING_PREFIX) === 0) {\n          removeClass($body, className);\n        }\n      });\n\n      if (getOptions().scrollOverflow) {\n        getState().panels.forEach(function (panel) {\n          scrollOverflowHandler.destroyScrollable(panel);\n        });\n      } //removing added classes\n\n\n      getNodes(getState().panels).forEach(function (item) {\n        removeClass(item, TABLE + ' ' + ACTIVE + ' ' + COMPLETELY + ' ' + IS_OVERFLOW + ' ' + LOADED);\n        var previousStyles = getAttr(item, 'data-fp-styles');\n\n        if (previousStyles) {\n          item.setAttribute('style', previousStyles);\n        } //removing anchors if they were not set using the HTML markup\n\n\n        if (hasClass(item, SECTION) && !getInitialAnchorsInDom()) {\n          item.removeAttribute('data-anchor');\n        }\n      }); //removing the applied transition from the fullpage wrapper\n\n      removeAnimation(getContainer()); //Unwrapping content\n\n      [TABLE_CELL_SEL, SLIDES_CONTAINER_SEL, SLIDES_WRAPPER_SEL].forEach(function (selector) {\n        $(selector, getContainer()).forEach(function (item) {\n          //unwrap not being use in case there's no child element inside and its just text\n          unwrap(item);\n        });\n      }); //removing the applied transition from the fullpage wrapper\n\n      css(getContainer(), {\n        '-webkit-transition': 'none',\n        'transition': 'none'\n      });\n      removeClass(getContainer(), WRAPPER); //scrolling the page to the top with no animation\n\n      win.scrollTo(0, 0); //removing selectors\n\n      var usedSelectors = [SECTION, SLIDE, SLIDES_CONTAINER];\n      usedSelectors.forEach(function (item) {\n        removeClass($('.' + item), item);\n      });\n      resetState();\n      EventEmitter.emit(events.onDestroyAll);\n    }\n\n    FP.destroy = destroy;\n    function init() {\n      updateStructuralState();\n      updateState();\n      getOptions().scrollBar = getOptions().scrollBar || getOptions().hybrid;\n      setOptionsFromDOM();\n      prepareDom();\n      setAllowScrolling(true);\n      setMouseHijack(true);\n      setAutoScrolling(getOptions().autoScrolling, 'internal');\n      responsive(); //setting the class for the body element\n\n      setBodyClass();\n\n      if (document.readyState !== 'loading') {\n        scrollToAnchor();\n      } else {\n        document.addEventListener('DOMContentLoaded', scrollToAnchor);\n      }\n\n      afterRenderActions(); // Updating the state again with the new DOM\n\n      updateStructuralState();\n      updateState();\n    }\n    /*\n    * Destroys fullpage.js plugin events and optinally its html markup and styles\n    */\n\n    function destroy(all) {\n      setAutoScrolling(false, 'internal');\n      setAllowScrolling(true);\n      setMouseHijack(false);\n      setKeyboardScrolling(false);\n      addClass(getContainer(), DESTROYED);\n      EventEmitter.emit(events.onDestroy); //lets make a mess!\n\n      if (all) {\n        destroyStructure();\n      }\n    }\n\n    var isOK = function isOK() {\n      return getOptions() && state.isValid || doc.domain.indexOf('al' + 'varotri' + 'go' + '.' + 'com') > -1;\n    };\n    /**\n    * Displays warnings\n    */\n\n\n    function displayWarnings() {\n      var l = getOptions()['li' + 'c' + 'enseK' + 'e' + 'y'];\n      var msgStyle = 'font-size: 15px;background:yellow;';\n\n      if (getOptions().licenseKey.trim() === '') {\n        showError('error', 'Fullpage.js requires a `licenseKey` option. Read about it on the following website:');\n        showError('error', 'https://alvarotrigo.com/fullPage/docs/#licensekey');\n      } else if (!isOK()) {\n        showError('error', 'Incorrect `licenseKey`. Get one for fullPage.js version 4 here:');\n        showError('error', 'https://alvarotrigo.com/fullPage/pricing');\n      } else if (l && l.length < 20) {\n        console.warn('%c This website was made using fullPage.js slider. Learn more on the following website:', msgStyle);\n        console.warn('%c https://alvarotrigo.com/fullPage/', msgStyle);\n      }\n\n      if (hasClass($html, ENABLED)) {\n        showError('error', 'Fullpage.js can only be initialized once and you are doing it multiple times!');\n        return;\n      } // Disable mutually exclusive settings\n\n\n      if (getOptions().continuousVertical && (getOptions().loopTop || getOptions().loopBottom)) {\n        getOptions().continuousVertical = false;\n        showError('warn', 'Option `loopTop/loopBottom` is mutually exclusive with `continuousVertical`; `continuousVertical` disabled');\n      }\n\n      if (getOptions().scrollOverflow && (getOptions().scrollBar || !getOptions().autoScrolling)) {\n        showError('warn', 'Options scrollBar:true and autoScrolling:false are mutually exclusive with scrollOverflow:true. Sections with scrollOverflow might not work well in Firefox');\n      }\n\n      if (getOptions().continuousVertical && (getOptions().scrollBar || !getOptions().autoScrolling)) {\n        getOptions().continuousVertical = false;\n        showError('warn', 'Scroll bars (`scrollBar:true` or `autoScrolling:false`) are mutually exclusive with `continuousVertical`; `continuousVertical` disabled');\n      } //using extensions? Wrong file!\n\n\n      extensions.forEach(function (extension) {\n        //is the option set to true?\n        if (getOptions()[extension]) {\n          showError('warn', 'fullpage.js extensions require fullpage.extensions.min.js file instead of the usual fullpage.js. Requested: ' + extension);\n        }\n      }); //anchors can not have the same value as any element ID or NAME\n\n      getOptions().anchors.forEach(function (name) {\n        //case insensitive selectors (http://stackoverflow.com/a/19465187/1081396)\n        var nameAttr = [].slice.call($('[name]')).filter(function (item) {\n          return getAttr(item, 'name') && getAttr(item, 'name').toLowerCase() == name.toLowerCase();\n        });\n        var idAttr = [].slice.call($('[id]')).filter(function (item) {\n          return getAttr(item, 'id') && getAttr(item, 'id').toLowerCase() == name.toLowerCase();\n        });\n\n        if (idAttr.length || nameAttr.length) {\n          showError('error', 'data-anchor tags can not have the same value as any `id` element on the site (or `name` element for IE).');\n          var propertyName = idAttr.length ? 'id' : 'name';\n\n          if (idAttr.length || nameAttr.length) {\n            showError('error', '\"' + name + '\" is is being used by another element `' + propertyName + '` property');\n          }\n        }\n      });\n    }\n\n    function fullpage(containerSelector, options) {\n      setCache(); //only once my friend!\n\n      if (hasClass($html, ENABLED)) {\n        displayWarnings();\n        return;\n      }\n\n      setOption('touchWrapper', typeof containerSelector === 'string' ? $(containerSelector)[0] : containerSelector); // Creating some defaults, extending them with any options that were provided\n\n      setOptions(options);\n      setContainer(typeof containerSelector === 'string' ? $(containerSelector)[0] : containerSelector);\n      EventEmitter.emit(events.onInitialise);\n      displayWarnings();\n      setAPI();\n\n      if (getContainer()) {\n        EventEmitter.emit(events.beforeInit);\n        init();\n        EventEmitter.emit(events.bindEvents);\n      }\n\n      setState({\n        isFullpageInitDone: true\n      }); // @ts-ignore\n\n      return win.fullpage_api;\n    }\n\n    function setAPI() {\n      FP.getFullpageData = function () {\n        return {\n          options: getOptions()\n        };\n      }; //public functions\n\n\n      FP.version = '4.0.41';\n      FP.test = Object.assign(FP.test, {\n        top: '0px',\n        translate3d: 'translate3d(0px, 0px, 0px)',\n        translate3dH: function () {\n          var a = [];\n\n          for (var i = 0; i < $(getOptions().sectionSelector, getContainer()).length; i++) {\n            a.push('translate3d(0px, 0px, 0px)');\n          }\n\n          return a;\n        }(),\n        left: function () {\n          var a = [];\n\n          for (var i = 0; i < $(getOptions().sectionSelector, getContainer()).length; i++) {\n            a.push(0);\n          }\n\n          return a;\n        }(),\n        options: getOptions(),\n        setAutoScrolling: null\n      }); //functions we want to share across files but which are not\n      //mean to be used on their own by developers\n\n      FP.shared = Object.assign(FP.shared, {\n        afterRenderActions: null,\n        isNormalScrollElement: false\n      }); // @ts-ignore\n\n      win.fullpage_api = FP;\n    }\n\n    // @ts-ignore\n\n    win.fp_easings = deepExtend(win.fp_easings, {\n      easeInOutCubic: function easeInOutCubic(t, b, c, d) {\n        if ((t /= d / 2) < 1) return c / 2 * t * t * t + b;\n        return c / 2 * ((t -= 2) * t * t + 2) + b;\n      }\n    });\n\n    /**\n     * jQuery adapter for fullPage.js 3.0.0\n     */\n    // @ts-ignore\n\n    if (win.jQuery) {\n      (function ($, fullpage) {\n\n        if (!$ || !fullpage) {\n          showError('error', 'jQuery is required to use the jQuery fullpage adapter!');\n          return;\n        }\n\n        $.fn.fullpage = function (options) {\n          options = $.extend({}, options, {\n            '$': $\n          });\n          new fullpage(this[0], options); // Creating the $.fn.fullpage object\n\n          Object.keys(FP).forEach(function (key) {\n            getOptions().$.fn.fullpage[key] = FP[key];\n          });\n        }; // @ts-ignore\n\n      })(win.jQuery, fullpage);\n    }\n\n    return fullpage;\n\n}));\n"
  },
  {
    "path": "examples/active-slide.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>Active Slide - fullPage.js</title>\n    <meta name=\"author\" content=\"Matthew Howell\" />\n    <meta name=\"description\" content=\"fullPage continuous scrolling demo.\" />\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,scroll,loop,continuous\" />\n    <meta name=\"Resource-type\" content=\"Document\" />\n\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\n\n    <!--[if IE]>\n        <script type=\"text/javascript\">\n             var console = { log: function() {} };\n        </script>\n    <![endif]-->\n</head>\n<body>\n\n<ul id=\"menu\">\n    <li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">First slide</a></li>\n    <li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second slide</a></li>\n    <li data-menuanchor=\"3rdPage\"><a href=\"#3rdPage\">Third slide</a></li>\n</ul>\n\n\n<select id=\"demosMenu\">\n    <option selected>Choose Demo</option>\n    <option id=\"simple\">Simple</option>\n    <option id=\"custom-arrows\">Custom arrows</option>\n    <option id=\"hide-sections\">Hide sections</option>\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\n    <option id=\"observer\">Observer</option>\n    <option id=\"jquery-adapter\">jQuery adapter</option>\n    <option id=\"active-slide\">Active section and slide</option>\n    <option id=\"auto-height\">Auto height</option>\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\n    <option id=\"backgrounds\">Background images</option>\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\n    <option id=\"background-video\">Background video</option>\n    <option id=\"callbacks\">Callbacks</option>\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\n    <option id=\"continuous-vertical\">Continuous vertical</option>\n    <option id=\"parallax\">Parallax (premium)</option>\n    <option id=\"cards\">Cards 3d (premium)</option>\n    <option id=\"water-effect\">Water effect (premium)</option>\n    <option id=\"drop-effect\">Drop effect (premium)</option>\n    <option id=\"css3\">CSS3</option>\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\n    <option id=\"easing-css3\">Easing CSS</option>\n    <option id=\"easing-js\">Easing JS</option>\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\n    <option id=\"fixed-headers\">Fixed headers</option>\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\n    <option id=\"looping\">Looping</option>\n    <option id=\"methods\">Methods</option>\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\n    <option id=\"no-anchor\">No anchor links</option>\n    <option id=\"normal-scroll\">Normal scrolling</option>\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\n    <option id=\"offset-sections\">Offset sections (premium)</option>\n    <option id=\"one-section\">One single section</option>\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\n    <option id=\"responsive-height\">Responsive Height</option>\n    <option id=\"responsive-width\">Responsive Width</option>\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\n    <option id=\"scrollBar\">Scroll bar enabled</option>\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\n    <option id=\"lazy-load\">Lazy load</option>\n    <option id=\"scrolling-speed\">Scrolling speed</option>\n    <option id=\"rtl\">RTL</option>\n    <option id=\"trigger-animations\">Trigger animations</option>\n    <option id=\"vue-fullpage\">Vue component</option>\n    <option id=\"react-fullpage\">React component</option>\n    <option id=\"angular-fullpage\">Angular component</option>\n</select>\n\n<div id=\"fullpage\">\n    <div class=\"section \" id=\"section0\">\n        <h1>Section 1</h1>\n    </div>\n    <div class=\"section active\" id=\"section1\">\n        <div class=\"slide\" id=\"slide1\">\n            <div class=\"intro\">\n                <h1>Slide 2.1</h1>\n            </div>\n        </div>\n        <div class=\"slide active\" id=\"slide2\">\n            <div class=\"intro\">\n                <h1>Slide 2.2</h1>\n                <p>\n                    We are using the class `active` on this section and in this particular horizontal slide. This way it will appear on the viewport on page load, instead of the 1st section 1st slide.\n                </p>\n                <p>You can apply the same logic to horizontal slides</p>\n            </div>\n        </div>\n        <div class=\"slide\" id=\"slide3\">\n            <h1>Slide 2.3</h1>\n        </div>\n\n    </div>\n    <div class=\"section\" id=\"section2\">\n        <div class=\"intro\">\n            <h1>Section 3</h1>\n        </div>\n    </div>\n</div>\n\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\n<script type=\"text/javascript\" src=\"examples.js\"></script>\n<script type=\"text/javascript\">\n    var myFullpage = new fullpage('#fullpage', {\n        sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE', 'whitesmoke', '#ccddff'],\n        anchors: ['firstPage', 'secondPage', '3rdPage', '4thpage', 'lastPage'],\n        menu: '#menu',\n        slidesNavigation: true,\n        lazyLoad: true,\n        credits: {enabled: false}\n    });\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "examples/angular-fullpage.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>Angular-fullpage - fullPage.js</title>\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n    <meta name=\"description\" content=\"fullPage auto-height example.\" />\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,auto-height,full-screen\" />\n    <meta name=\"Resource-type\" content=\"Document\" />\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/angular-fullpage/\" />\n</head>\n<body>\n\nRedirecting...\n\n</body>\n</html>"
  },
  {
    "path": "examples/auto-height.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Auto-height - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage auto-height example.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,auto-height,full-screen\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\r\n    <!--[if IE]>\r\n        <script type=\"text/javascript\">\r\n             var console = { log: function() {} };\r\n        </script>\r\n    <![endif]-->\r\n\r\n    <style>\r\n      .myContent{\r\n        height: 300px;\r\n      }\r\n    </style>\r\n\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n\r\n<ul id=\"menu\">\r\n  <li data-menuanchor=\"anchor1\"><a href=\"#anchor1\">First slide</a></li>\r\n  <li data-menuanchor=\"anchor2\"><a href=\"#anchor2\">Second slide</a></li>\r\n  <li data-menuanchor=\"anchor3\"><a href=\"#anchor3\">Third slide</a></li>\r\n</ul>\r\n\r\n<div id=\"fullpage\">\r\n    <div class=\"section\" id=\"section0\">\r\n        <div class=\"intro\">\r\n          <h1>Section 1</h1>\r\n          <p>Scroll down to see auto-height sections</p>\r\n        </div>\r\n    </div>\r\n    <div class=\"section fp-auto-height\" id=\"section1\">\r\n        <div class=\"slide\" id=\"slide1\">\r\n          <div class=\"myContent\">\r\n              <h1>Section 2</h1>\r\n            </div>\r\n        </div>\r\n        <div class=\"slide\" id=\"slide2\">\r\n            <h1>Section 2.2</h1>\r\n        </div>\r\n    </div>\r\n    <div class=\"section fp-auto-height\" id=\"section2\">\r\n        <div class=\"myContent\">\r\n          <h1>Section 3</h1>\r\n        </div>\r\n    </div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n  var myFullpage = new fullpage('#fullpage', {\r\n      verticalCentered: true,\r\n      anchors: ['anchor1', 'anchor2', 'anchor3'],\r\n      menu: '#menu',\r\n      sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE']\r\n  });\r\n</script>\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/autoplay-video-and-audio.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Autoplay / pause media - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage full-screen autoplay videos and audio.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,autoplay,video,audio,html5,paluse\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n    <style>\r\n    .intro p{\r\n        color: #fff;\r\n    }\r\n    video{\r\n      width: 50%;\r\n    }\r\n    </style>\r\n\r\n    <!--[if IE]>\r\n        <script type=\"text/javascript\">\r\n             var console = { log: function() {} };\r\n        </script>\r\n    <![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n\r\n<div id=\"fullpage\">\r\n    <div class=\"section intro\">\r\n      <div>\r\n        <iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/qiCVPpI9l3M?mute=1\" frameborder=\"0\" allowfullscreen data-autoplay></iframe>\r\n        <p>\r\n          The video will automatically start playing as I'm usign the attribute `data-autoplay`.\r\n        </p>\r\n        <p>\r\n          And because I'm not using the attribute `data-keepplaying` the video will automatically stop playing after leaving the section or slide.\r\n        </p>\r\n        <p>\r\n          Notice videos will only autoPlay in Desktop devices due to browser limitations. Also, it won't autoplay in Chrome browser unless you use the parameter ?mute=1 on the `src` attribute URL\r\n        </p>\r\n      </div>\r\n    </div>\r\n    <div class=\"section\">\r\n        <div class=\"slide\">\r\n          <div>\r\n            <h1>HTML 5 videos</h1>\r\n            <video loop muted controls=\"false\" data-autoplay>\r\n              <source src=\"http://www.w3schools.com/html/mov_bbb.mp4\" type=\"video/mp4\">\r\n              <source src=\"http://www.w3schools.com/html/mov_bbb.ogg\" type=\"video/ogg\">\r\n            </video>\r\n          </div>\r\n        </div>\r\n        <div class=\"slide intro\">\r\n          <div>\r\n            <h1>In slides!</h1>\r\n            <iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/qiCVPpI9l3M\" frameborder=\"0\" allowfullscreen data-autoplay></iframe>\r\n          </div>\r\n        </div>\r\n    </div>\r\n    <div class=\"section\">\r\n      <div>\r\n        <h1>Audio</h1>\r\n        <audio controls=\"\" data-autoplay>\r\n            <source src=\"imgs/horse.ogg\" type=\"audio/ogg\">\r\n            <source src=\"imgs/horse.mp3\" type=\"audio/mpeg\">\r\n            Your browser does not support the audio element.\r\n        </audio>\r\n      </div>\r\n    </div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        sectionsColor: ['#C63D0F', '#1BBC9B', '#7E8F7C'],\r\n        anchors: ['firstPage', 'secondPage', '3rdPage']\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/background-video.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>Background video - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage full-screen background videos.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,video,full-screen\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\t<style>\r\n\r\n\t/* Style for our header texts\r\n\t* --------------------------------------- */\r\n\th1{\r\n\t\tfont-size: 5em;\r\n\t\tfont-family: arial,helvetica;\r\n\t\tcolor: #fff;\r\n\t\tmargin:0;\r\n\t\tpadding:0;\r\n\t}\r\n\r\n\t/* Centered texts in each section\r\n\t* --------------------------------------- */\r\n\t.section{\r\n\t\ttext-align:center;\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t#myVideo{\r\n\t\tposition: absolute;\r\n\t\tright: 0;\r\n\t\tbottom: 0;\r\n\t\ttop:0;\r\n\t\twidth: 100%;\r\n\t\theight: 100%;\r\n\t\tbackground-size: 100% 100%;\r\n \t\tbackground-color: black; /* in case the video doesn't fit the whole page*/\r\n  \t\tbackground-image: /* our video */;\r\n  \t\tbackground-position: center center;\r\n  \t\tbackground-size: contain;\r\n   \t\tobject-fit: cover; /*cover video background */\r\n   \t\tz-index:3;\r\n\t}\r\n\r\n\r\n\r\n\t/* Layer with position absolute in order to have it over the video\r\n\t* --------------------------------------- */\r\n\t#section0 .layer{\r\n\t\tposition: absolute;\r\n\t\tz-index: 4;\r\n\t\twidth: 100%;\r\n\t\tleft: 0;\r\n\t\ttop: 43%;\r\n\r\n\t\t/*\r\n\t\t* Preventing flicker on some browsers\r\n\t\t* See http://stackoverflow.com/a/36671466/1081396  or issue #183\r\n\t\t*/\r\n\t\t-webkit-transform: translate3d(0,0,0);\r\n\t\t-ms-transform: translate3d(0,0,0);\r\n\t\ttransform: translate3d(0,0,0);\r\n\t}\r\n\r\n\t/*solves problem with overflowing video in Mac with Chrome */\r\n\t#section0{\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\r\n\t/* Bottom menu\r\n\t* --------------------------------------- */\r\n\t#infoMenu li a {\r\n\t\tcolor: #fff;\r\n\t}\r\n\r\n\r\n\t/* Hiding video controls\r\n\t* See: https://css-tricks.com/custom-controls-in-html5-video-full-screen/\r\n\t* --------------------------------------- */\r\n\tvideo::-webkit-media-controls {\r\n\t  display:none !important;\r\n\t}\r\n\r\n\t</style>\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section \" id=\"section0\">\r\n\t\t<video id=\"myVideo\" loop muted data-autoplay playsinline>\r\n\t\t\t<source src=\"imgs/flowers.mp4\" type=\"video/mp4\">\r\n\t\t\t<source src=\"imgs/flowers.webm\" type=\"video/webm\">\r\n\t\t</video>\r\n\t\t<div class=\"layer\">\r\n\t\t\t<h1>fullPage.js videos</h1>\r\n\t\t\t<p>Don't forget to add \"playsinline\" attribute to make it work on phones</p>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t    <div class=\"slide\" id=\"slide1\"><h1>Slide Backgrounds</h1></div>\r\n\t    <div class=\"slide\" id=\"slide2\"><h1>Totally customizable</h1></div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\"><h1>Lovely images <br />for a lovely page</h1></div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        verticalCentered: true,\r\n        sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE']\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "examples/backgrounds-fixed.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>Fixed fullscreen backgrounds - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage fixed full-screen backgrounds.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fixed,fullscreen,backgrounds,full-screen\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\t<style>\r\n\r\n\t/* Style for our header texts\r\n\t* --------------------------------------- */\r\n\th1{\r\n\t\tfont-size: 5em;\r\n\t\tfont-family: arial,helvetica;\r\n\t\tcolor: #fff;\r\n\t\tmargin:0;\r\n\t\tpadding:0;\r\n\t}\r\n\r\n\t/* Centered texts in each section\r\n\t* --------------------------------------- */\r\n\t.section{\r\n\t\ttext-align:center;\r\n\t}\r\n\r\n\r\n\t/* Backgrounds will cover all the section\r\n\t* --------------------------------------- */\r\n\t#section0,\r\n\t#section1,\r\n\t#section2,\r\n\t#section3,\r\n    #slide1,\r\n    #slide2{\r\n\t\tbackground-size: cover;\r\n\t\tbackground-attachment: fixed;\r\n\t}\r\n\r\n\t/* Defining each sectino background and styles\r\n\t* --------------------------------------- */\r\n\t#section0{\r\n\t\tbackground-image: url(imgs/bg1.jpg);\r\n\t}\r\n\t#section0 h1{\r\n\t\ttop: 50%;\r\n\t\ttransform: translateY(-50%);\r\n\t\tposition: relative;\r\n\t}\r\n\t#section2{\r\n\t\tbackground-image: url(imgs/bg3.jpg);\r\n\t\tpadding: 6% 0 0 0;\r\n\t}\r\n\t#section3{\r\n\t\tbackground-image: url(imgs/bg4.jpg);\r\n\t\tpadding: 6% 0 0 0;\r\n\t}\r\n\t#section3 h1{\r\n\t\tcolor: #000;\r\n\t}\r\n\r\n\r\n\t/*Adding background for the slides\r\n\t* --------------------------------------- */\r\n\t#slide1{\r\n\t\tbackground-image: url(imgs/bg2.jpg);\r\n\t\tpadding: 6% 0 0 0;\r\n\t}\r\n\t#slide2{\r\n\t\tbackground-image: url(imgs/bg5.jpg);\r\n\t\tpadding: 6% 0 0 0;\r\n\t}\r\n\r\n\r\n\t/* Bottom menu\r\n\t* --------------------------------------- */\r\n\t#infoMenu li a {\r\n\t\tcolor: #fff;\r\n\t}\r\n\t</style>\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n<a href=\"https://github.com/alvarotrigo/fullPage.js\" id=\"githubLink\"><img style=\"position: fixed;z-index:99; top: 0; right: 0; border: 0;\" src=\"https://s3.amazonaws.com/github/ribbons/forkme_right_orange_ff7600.png\" alt=\"Fork me on GitHub\"></a>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section \" id=\"section0\"><h1>fullPage.js</h1></div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t\t<div class=\"slide\" id=\"slide1\"><h1>Slide Backgrounds</h1></div>\r\n\t\t<div class=\"slide\" id=\"slide2\"><h1>Totally customizable</h1></div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\"><h1>Lovely images <br />for a lovely page</h1></div>\r\n\t<div class=\"section\" id=\"section3\"><h1>One Image = One thousand words</h1></div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        verticalCentered: false,\r\n\r\n        //to avoid problems with css3 transforms and fixed elements in Chrome, as detailed here: https://github.com/alvarotrigo/fullPage.js/issues/208\r\n        css3:false\r\n    });\r\n</script>\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/backgrounds.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>Background images - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage full-screen backgrounds.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,backgrounds,full-screen\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\t<style>\r\n\r\n\t/* Style for our header texts\r\n\t* --------------------------------------- */\r\n\th1{\r\n\t\tfont-size: 5em;\r\n\t\tfont-family: arial,helvetica;\r\n\t\tcolor: #fff;\r\n\t\tmargin:0;\r\n\t\tpadding:0;\r\n\t}\r\n\r\n\t/* Centered texts in each section\r\n\t* --------------------------------------- */\r\n\t.section{\r\n\t\ttext-align:center;\r\n\t}\r\n\r\n\r\n\t/* Backgrounds will cover all the section\r\n\t* --------------------------------------- */\r\n\t.section{\r\n\t\tbackground-size: cover;\r\n\t}\r\n\t.slide{\r\n\t\tbackground-size: cover;\r\n\t}\r\n\r\n\t/* Defining each section background and styles\r\n\t* --------------------------------------- */\r\n\t#section0{\r\n\t\tbackground-image: url(imgs/bg1.jpg);\r\n\t}\r\n\t#section0 h1{\r\n\t\ttop: 50%;\r\n\t\ttransform: translateY(-50%);\r\n\t\tposition: relative;\r\n\t}\r\n\t#section2{\r\n\t\tbackground-image: url(imgs/bg3.jpg);\r\n\t\tpadding: 6% 0 0 0;\r\n\t}\r\n\t#section3{\r\n\t\tbackground-image: url(imgs/bg4.jpg);\r\n\t\tpadding: 6% 0 0 0;\r\n\t}\r\n\t#section3 h1{\r\n\t\tcolor: #000;\r\n\t}\r\n\r\n\r\n\t/*Adding background for the slides\r\n\t* --------------------------------------- */\r\n\t#slide1{\r\n\t\tbackground-image: url(imgs/bg2.jpg);\r\n\t\tpadding: 6% 0 0 0;\r\n\t}\r\n\t#slide2{\r\n\t\tbackground-image: url(imgs/bg5.jpg);\r\n\t\tpadding: 6% 0 0 0;\r\n\t}\r\n\r\n\r\n\t/* Bottom menu\r\n\t* --------------------------------------- */\r\n\t#infoMenu li a {\r\n\t\tcolor: #fff;\r\n\t}\r\n\t</style>\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n<a href=\"https://github.com/alvarotrigo/fullPage.js\" id=\"githubLink\"><img style=\"position: fixed;z-index:99; top: 0; right: 0; border: 0;\" src=\"https://s3.amazonaws.com/github/ribbons/forkme_right_orange_ff7600.png\" alt=\"Fork me on GitHub\"></a>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section \" id=\"section0\"><h1>fullPage.js</h1></div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t\t<div class=\"slide\" id=\"slide1\"><h1>Slide Backgrounds</h1></div>\r\n\t\t<div class=\"slide\" id=\"slide2\"><h1>Totally customizable</h1></div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\"><h1>Lovely images <br />for a lovely page</h1></div>\r\n\t<div class=\"section\" id=\"section3\"><h1>One Image = One thousand words</h1></div>\r\n</div>\r\n\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        verticalCentered: false\r\n    });\r\n</script>\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/callbacks.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>Callback functions version 3 - fullPage.js</title>\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n    <meta name=\"description\" content=\"fullPage callback function.\" />\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,callback,function,event\" />\n    <meta name=\"Resource-type\" content=\"Document\" />\n\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\n\n    <!--[if IE]>\n        <script type=\"text/javascript\">\n             var console = { log: function() {} };\n        </script>\n    <![endif]-->\n    <style>\n    #callbacksDiv p{\n      font-size:1.2em;\n    }\n    #callbacksDiv h4{\n        font-size: 1.4em;\n        font-weight: bold;\n        color: white;\n        text-decoration: underline;\n    }\n    .box{\n        margin: 7em 0;\n    }\n\n    </style>\n</head>\n<body>\n\n<div style=\"position:fixed;top:50px;left:50px;color:white;z-index:999;\" id=\"callbacksDiv\"></div>\n\n\n<ul id=\"menu\">\n    <li data-menuanchor=\"firstPage\"><a href=\"#firstPage\">First slide</a></li>\n    <li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second slide</a></li>\n    <li data-menuanchor=\"3rdPage\"><a href=\"#3rdPage\">Third slide</a></li>\n</ul>\n\n<select id=\"demosMenu\">\n    <option selected>Choose Demo</option>\n    <option id=\"simple\">Simple</option>\n    <option id=\"custom-arrows\">Custom arrows</option>\n    <option id=\"hide-sections\">Hide sections</option>\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\n    <option id=\"observer\">Observer</option>\n    <option id=\"jquery-adapter\">jQuery adapter</option>\n    <option id=\"active-slide\">Active section and slide</option>\n    <option id=\"auto-height\">Auto height</option>\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\n    <option id=\"backgrounds\">Background images</option>\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\n    <option id=\"background-video\">Background video</option>\n    <option id=\"callbacks\">Callbacks</option>\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\n    <option id=\"continuous-vertical\">Continuous vertical</option>\n    <option id=\"parallax\">Parallax (premium)</option>\n    <option id=\"cards\">Cards 3d (premium)</option>\n    <option id=\"water-effect\">Water effect (premium)</option>\n    <option id=\"drop-effect\">Drop effect (premium)</option>\n    <option id=\"css3\">CSS3</option>\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\n    <option id=\"easing-css3\">Easing CSS</option>\n    <option id=\"easing-js\">Easing JS</option>\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\n    <option id=\"fixed-headers\">Fixed headers</option>\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\n    <option id=\"looping\">Looping</option>\n    <option id=\"methods\">Methods</option>\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\n    <option id=\"no-anchor\">No anchor links</option>\n    <option id=\"normal-scroll\">Normal scrolling</option>\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\n    <option id=\"offset-sections\">Offset sections (premium)</option>\n    <option id=\"one-section\">One single section</option>\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\n    <option id=\"responsive-height\">Responsive Height</option>\n    <option id=\"responsive-width\">Responsive Width</option>\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\n    <option id=\"scrollBar\">Scroll bar enabled</option>\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\n    <option id=\"lazy-load\">Lazy load</option>\n    <option id=\"scrolling-speed\">Scrolling speed</option>\n    <option id=\"rtl\">RTL</option>\n    <option id=\"trigger-animations\">Trigger animations</option>\n    <option id=\"vue-fullpage\">Vue component</option>\n    <option id=\"react-fullpage\">React component</option>\n    <option id=\"angular-fullpage\">Angular component</option>\n  </select>\n\n<div id=\"fullpage\">\n    <div class=\"section \" id=\"section0\">\n        <h1>fullPage.js</h1>\n        <p>Callbacks!</p>\n    </div>\n    <div class=\"section\" id=\"section1\">\n        <div class=\"slide\">\n            <div class=\"intro\">\n                <h1>Feel free</h1>\n                <p>All the callbacks you need to do whatever you need.</p>\n                <p>Just what you would expect.</p>\n            </div>\n        </div>\n        <div class=\"slide\">\n            <h1>Slide 2</h1>\n        </div>\n    </div>\n    <div class=\"section\" id=\"section2\">\n        <div class=\"intro\">\n            <div class=\"box\">\n                <h1>Ideal for animations</h1>\n                <p>Total control over your website.</p>\n            </div>\n            <div class=\"box\">\n                <h1>Ideal for animations</h1>\n                <p>Total control over your website.</p>\n            </div>\n            <div class=\"box\">\n                <h1>Ideal for animations</h1>\n                <p>Total control over your website.</p>\n            </div>\n            <div class=\"box\">\n                <h1>Ideal for animations</h1>\n                <p>Total control over your website.</p>\n            </div>\n            <div class=\"box\">\n                <h1>Ideal for animations</h1>\n                <p>Total control over your website.</p>\n            </div>\n            <div class=\"box\">\n                <h1>Ideal for animations</h1>\n                <p>Total control over your website.</p>\n            </div>\n            \n        </div>\n    </div>\n</div>\n\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\n<script type=\"text/javascript\" src=\"examples.js\"></script>\n<script type=\"text/javascript\">\n    var deleteLog = false;\n\n    //adding the params info into the page\n    function addToLog(callbackName, params){\n        var callbackData = '<h4>' + callbackName + '</h4>';\n        Object.keys(params).forEach(function(key){\n            var content =  params[key];\n\n            if(content !== null && typeof content === 'object'){\n                content = JSON.stringify(content);\n            }\n            callbackData += '<p><b>' + key + '</b>: ' + content + '</p>';\n        });\n        callbackData += '<br />';\n\n        document.getElementById('callbacksDiv').innerHTML += callbackData;\n    }\n\n    //fullpage initialisation\n    var myFullpage = new fullpage('#fullpage', {\n        sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE', 'whitesmoke', '#ccddff'],\n        anchors: ['firstPage', 'secondPage', '3rdPage', '4thpage', 'lastPage'],\n        menu: '#menu',\n\n        beforeLeave: function(origin, destination, direction, trigger){\n            var params = {\n                origin: origin,\n                destination:destination,\n                direction: direction,\n                trigger: trigger\n            };\n\n            //clearing the logging in the screen\n            if(deleteLog){\n                document.getElementById('callbacksDiv').innerHTML = '';\n            }\n\n            addToLog('beforeLeave', params);\n\n            console.log(\"--- beforeLeave ---\");\n            console.log(params);\n        },\n        onLeave: function(origin, destination, direction, trigger){\n            var params = {\n                origin: origin,\n                destination:destination,\n                direction: direction,\n                trigger: trigger\n            };\n\n            addToLog('onLeave', params);\n\n            console.log(\"--- onLeave ---\");\n            console.log(params);\n        },\n        onSlideLeave: function(section, origin, destination, direction, trigger){\n            var params = {\n                section: section,\n                origin: origin,\n                destination: destination,\n                direction: direction,\n                trigger: trigger\n            };\n\n            //clearing the logging in the screen\n            if(deleteLog){\n                document.getElementById('callbacksDiv').innerHTML = '';\n            }\n\n            addToLog('onSlideLeave', params);\n\n            console.log(\"--- onSlideLeave ---\");\n            console.log(params);\n        },\n        afterRender: function(){\n            addToLog('afterRender', {});\n            console.log(\"afterRender\");\n        },\n        afterResize: function(width, height){\n            addToLog('afterResize', {\n                width: width,\n                height: height\n            });\n\n            console.log(\"afterResize\");\n            console.log(params);\n        },\n        afterSlideLoad: function(section, origin, destination, direction, trigger){\n            var params = {\n                section: section,\n                origin: origin,\n                destination: destination,\n                direction: direction,\n                trigger: trigger\n            };\n\n            addToLog('afterSlideLoad', params);\n\n            console.log(\"--- afterSlideLoad ---\");\n            console.log(params);\n            console.log(\"----------------\");\n\n            deleteLog = true;\n        },\n        afterLoad: function(origin, destination, direction, trigger){\n            var params = {\n                origin: origin,\n                destination: destination,\n                direction: direction, \n                trigger: trigger\n            };\n            addToLog('afterLoad', params);\n\n            console.log(\"--- afterLoad ---\");\n            console.log(this);\n            console.log('===============');\n\n            deleteLog = true;\n        },\n\n        onScrollOverflow: function(section, slide, position, direction){\n            var params = {\n                section: section,\n                slide: slide,\n                position: position,\n                direction: direction\n            };\n\n            console.log(\"--- onScrollOverflow ---\");\n            console.log(params);\n            \n            if(deleteLog){\n                document.getElementById('callbacksDiv').innerHTML = '';\n            }\n\n            addToLog('onScrollOverflow', params);\n            deleteLog = true;\n        }\n    });\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "examples/cards.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>Cards 3d - fullPage.js</title>\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n    <meta name=\"description\" content=\"fullPage Cards 3d extension example.\" />\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,auto-height,full-screen\" />\n    <meta name=\"Resource-type\" content=\"Document\" />\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/fullPage/extensions/cards.html\" />\n</head>\n<body>\n\nRedirecting...\n\n</body>\n</html>"
  },
  {
    "path": "examples/cinematic.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>Cinematic Effects - fullPage.js</title>\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n    <meta name=\"description\" content=\"fullPage Cinematic Effects example.\" />\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,cinematic,slider,transitions\" />\n    <meta name=\"Resource-type\" content=\"Document\" />\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/fullPage/extensions/cinematic.html\" />\n</head>\n<body>\n\nRedirecting...\n\n</body>\n</html>"
  },
  {
    "path": "examples/continuous-horizontal.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Continuous Horizontal - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage Continuous Horizontal example.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,auto-height,full-screen\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/fullPage/extensions/continuous-horizontal.html\" />\r\n</head>\r\n<body>\r\n\r\nRedirecting...\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/continuous-vertical.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<title>Continuous Vertical scrolling - fullPage.js</title>\n\t<meta name=\"author\" content=\"Matthew Howell\" />\n\t<meta name=\"description\" content=\"fullPage continuous scrolling demo.\" />\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,demo,scroll,loop,continuous\" />\n\t<meta name=\"Resource-type\" content=\"Document\" />\n\n\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\n\n\t<!--[if IE]>\n\t\t<script type=\"text/javascript\">\n\t\t\t var console = { log: function() {} };\n\t\t</script>\n\t<![endif]-->\n</head>\n<body>\n\n\n<select id=\"demosMenu\">\n    <option selected>Choose Demo</option>\n    <option id=\"simple\">Simple</option>\n    <option id=\"custom-arrows\">Custom arrows</option>\n    <option id=\"hide-sections\">Hide sections</option>\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\n    <option id=\"observer\">Observer</option>\n    <option id=\"jquery-adapter\">jQuery adapter</option>\n    <option id=\"active-slide\">Active section and slide</option>\n    <option id=\"auto-height\">Auto height</option>\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\n    <option id=\"backgrounds\">Background images</option>\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\n    <option id=\"background-video\">Background video</option>\n    <option id=\"callbacks\">Callbacks</option>\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\n    <option id=\"continuous-vertical\">Continuous vertical</option>\n    <option id=\"parallax\">Parallax (premium)</option>\n    <option id=\"cards\">Cards 3d (premium)</option>\n    <option id=\"water-effect\">Water effect (premium)</option>\n    <option id=\"drop-effect\">Drop effect (premium)</option>\n    <option id=\"css3\">CSS3</option>\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\n    <option id=\"easing-css3\">Easing CSS</option>\n    <option id=\"easing-js\">Easing JS</option>\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\n    <option id=\"fixed-headers\">Fixed headers</option>\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\n    <option id=\"looping\">Looping</option>\n    <option id=\"methods\">Methods</option>\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\n    <option id=\"no-anchor\">No anchor links</option>\n    <option id=\"normal-scroll\">Normal scrolling</option>\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\n    <option id=\"offset-sections\">Offset sections (premium)</option>\n    <option id=\"one-section\">One single section</option>\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\n    <option id=\"responsive-height\">Responsive Height</option>\n    <option id=\"responsive-width\">Responsive Width</option>\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\n    <option id=\"scrollBar\">Scroll bar enabled</option>\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\n    <option id=\"lazy-load\">Lazy load</option>\n    <option id=\"scrolling-speed\">Scrolling speed</option>\n    <option id=\"rtl\">RTL</option>\n    <option id=\"trigger-animations\">Trigger animations</option>\n    <option id=\"vue-fullpage\">Vue component</option>\n    <option id=\"react-fullpage\">React component</option>\n    <option id=\"angular-fullpage\">Angular component</option>\n  </select>\n\n\n<ul id=\"menu\">\n\t<li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">First slide</a></li>\n\t<li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second slide</a></li>\n\t<li data-menuanchor=\"3rdPage\"><a href=\"#3rdPage\">Third slide</a></li>\n</ul>\n\n<div id=\"fullpage\">\n\t<div class=\"section \" id=\"section0\">\n\t\t<h1>fullPage.js</h1>\n\t\t<p>Continuous Scrolling Enabled</p>\n\t</div>\n\t<div class=\"section\" id=\"section1\">\n\t\t<div class=\"intro\">\n\t\t\t<h1>Keep Scrolling</h1>\n\t\t\t<p>Move to the first section and scroll up or move to the last and scroll down to see how it works.</p>\n\t\t</div>\n\t</div>\n\t<div class=\"section\" id=\"section2\">\n\t\t<div class=\"intro\">\n\t\t\t<h1>Scroll Down</h1>\n\t\t\t<p>And it will animate down to the first section</p>\n\t\t</div>\n\t</div>\n</div>\n\n\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\n<script type=\"text/javascript\" src=\"examples.js\"></script>\n\n<script type=\"text/javascript\">\n    var myFullpage = new fullpage('#fullpage', {\n      sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE', 'whitesmoke', '#ccddff'],\n      anchors: ['firstPage', 'secondPage', '3rdPage', '4thpage', 'lastPage'],\n      menu: '#menu',\n      continuousVertical: true,\n      navigation: true,\n      afterLoad: function(origin, destination, direction, trigger){\n        console.log(\"afterLoad: destination:\" + destination.index);\n      },\n      onLeave: function(origin, destination, direction, trigger){\n        console.log(\"onLeave: destination:\" + destination.index);\n      },\n    });\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "examples/css3.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<title>CSS3 - fullPage.js</title>\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n\t<meta name=\"description\" content=\"fullPage.js using CSS3 transformations.\" />\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,anchor,links,inside,demo,css,css3\" />\n\t<meta name=\"Resource-type\" content=\"Document\" />\n\n\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\n\n\t<!--[if IE]>\n\t\t<script type=\"text/javascript\">\n\t\t\t var console = { log: function() {} };\n\t\t</script>\n\t<![endif]-->\n</head>\n<body>\n\n\n<select id=\"demosMenu\">\n    <option selected>Choose Demo</option>\n    <option id=\"simple\">Simple</option>\n    <option id=\"custom-arrows\">Custom arrows</option>\n    <option id=\"hide-sections\">Hide sections</option>\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\n    <option id=\"observer\">Observer</option>\n    <option id=\"jquery-adapter\">jQuery adapter</option>\n    <option id=\"active-slide\">Active section and slide</option>\n    <option id=\"auto-height\">Auto height</option>\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\n    <option id=\"backgrounds\">Background images</option>\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\n    <option id=\"background-video\">Background video</option>\n    <option id=\"callbacks\">Callbacks</option>\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\n    <option id=\"continuous-vertical\">Continuous vertical</option>\n    <option id=\"parallax\">Parallax (premium)</option>\n    <option id=\"cards\">Cards 3d (premium)</option>\n    <option id=\"water-effect\">Water effect (premium)</option>\n    <option id=\"drop-effect\">Drop effect (premium)</option>\n    <option id=\"css3\">CSS3</option>\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\n    <option id=\"easing-css3\">Easing CSS</option>\n    <option id=\"easing-js\">Easing JS</option>\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\n    <option id=\"fixed-headers\">Fixed headers</option>\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\n    <option id=\"looping\">Looping</option>\n    <option id=\"methods\">Methods</option>\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\n    <option id=\"no-anchor\">No anchor links</option>\n    <option id=\"normal-scroll\">Normal scrolling</option>\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\n    <option id=\"offset-sections\">Offset sections (premium)</option>\n    <option id=\"one-section\">One single section</option>\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\n    <option id=\"responsive-height\">Responsive Height</option>\n    <option id=\"responsive-width\">Responsive Width</option>\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\n    <option id=\"scrollBar\">Scroll bar enabled</option>\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\n    <option id=\"lazy-load\">Lazy load</option>\n    <option id=\"scrolling-speed\">Scrolling speed</option>\n    <option id=\"rtl\">RTL</option>\n    <option id=\"trigger-animations\">Trigger animations</option>\n    <option id=\"vue-fullpage\">Vue component</option>\n    <option id=\"react-fullpage\">React component</option>\n    <option id=\"angular-fullpage\">Angular component</option>\n  </select>\n\n\n<div id=\"fullpage\">\n\t<div class=\"section \" id=\"section0\">\n\t\t<h1>fullPage.js</h1>\n\t\t<p>CSS3 is active by default</p>\n\t</div>\n\t<div class=\"section\" id=\"section1\">\n\t\t<div class=\"intro\">\n\t\t\t<h1>Speed on mobile</h1>\n\t\t\t<p>\n\t      If CSS3 transforms are supported they will be used for animations.\n\t\t\t</p>\n\t\t</div>\n\t</div>\n\t<div class=\"section\" id=\"section2\">\n\t\t<div class=\"intro\">\n\t\t\t<h1>No CSS3? No problem!</h1>\n\t\t\t<p>If CSS3 is not available, animations will fall back to JavaScript driven animations.</p>\n\t\t</div>\n\t</div>\n</div>\n\n\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\n<script type=\"text/javascript\" src=\"examples.js\"></script>\n<script type=\"text/javascript\">\n    var myFullpage = new fullpage('#fullpage', {\n        sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE'],\n        css3: false\n    });\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "examples/custom-arrows.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<title>Custom Arrows - fullPage.js</title>\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n\t<meta name=\"description\" content=\"fullPage.js using CSS3 transformations.\" />\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,anchor,links,inside,demo,css,css3\" />\n\t<meta name=\"Resource-type\" content=\"Document\" />\n\n\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\n    <style>\n        .my-arrow{\n            font-size: 4em;\n        }\n    </style>\n</head>\n<body>\n\n\n<select id=\"demosMenu\">\n    <option selected>Choose Demo</option>\n    <option id=\"simple\">Simple</option>\n    <option id=\"custom-arrows\">Custom arrows</option>\n    <option id=\"hide-sections\">Hide sections</option>\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\n    <option id=\"observer\">Observer</option>\n    <option id=\"jquery-adapter\">jQuery adapter</option>\n    <option id=\"active-slide\">Active section and slide</option>\n    <option id=\"auto-height\">Auto height</option>\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\n    <option id=\"backgrounds\">Background images</option>\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\n    <option id=\"background-video\">Background video</option>\n    <option id=\"callbacks\">Callbacks</option>\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\n    <option id=\"continuous-vertical\">Continuous vertical</option>\n    <option id=\"parallax\">Parallax (premium)</option>\n    <option id=\"cards\">Cards 3d (premium)</option>\n    <option id=\"water-effect\">Water effect (premium)</option>\n    <option id=\"drop-effect\">Drop effect (premium)</option>\n    <option id=\"css3\">CSS3</option>\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\n    <option id=\"easing-css3\">Easing CSS</option>\n    <option id=\"easing-js\">Easing JS</option>\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\n    <option id=\"fixed-headers\">Fixed headers</option>\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\n    <option id=\"looping\">Looping</option>\n    <option id=\"methods\">Methods</option>\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\n    <option id=\"no-anchor\">No anchor links</option>\n    <option id=\"normal-scroll\">Normal scrolling</option>\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\n    <option id=\"offset-sections\">Offset sections (premium)</option>\n    <option id=\"one-section\">One single section</option>\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\n    <option id=\"responsive-height\">Responsive Height</option>\n    <option id=\"responsive-width\">Responsive Width</option>\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\n    <option id=\"scrollBar\">Scroll bar enabled</option>\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\n    <option id=\"lazy-load\">Lazy load</option>\n    <option id=\"scrolling-speed\">Scrolling speed</option>\n    <option id=\"rtl\">RTL</option>\n    <option id=\"trigger-animations\">Trigger animations</option>\n    <option id=\"vue-fullpage\">Vue component</option>\n    <option id=\"react-fullpage\">React component</option>\n    <option id=\"angular-fullpage\">Angular component</option>\n  </select>\n\n\n<div id=\"fullpage\">\n\t<div class=\"section \" id=\"section0\">\n        <div class=\"slide\">\n            <h1>fullPage.js</h1>\n\t\t    <p>Use custom arrows for horizontal slides</p>\n        </div>\n        <div class=\"slide\">\n            <h1>Cool uh?</h1>\n\t\t    <p>We are now using Font Awesome icons instead</p>\n        </div>\n\n\t\t\n\t</div>\n\t<div class=\"section\" id=\"section1\">\n\t\t<div class=\"intro\">\n\t\t\t<h1>Control</h1>\n\t\t\t<p>\n                Have total control over your arrows HTML by <br />using the `controlArrowsHTML` option.\n\t\t\t</p>\n\t\t</div>\n\t</div>\n\t<div class=\"section\" id=\"section2\">\n\t\t<div class=\"intro\">\n\t\t\t<h1>Check it out!</h1>\n\t\t\t<p>You'll love it</p>\n\t\t</div>\n\t</div>\n</div>\n\n<script src=\"https://use.fontawesome.com/releases/v5.15.4/js/all.js\"></script>\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\n<script type=\"text/javascript\" src=\"examples.js\"></script>\n<script type=\"text/javascript\">\n    var myFullpage = new fullpage('#fullpage', {\n        sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE'],\n        controlArrows: true,\n        controlArrowsHTML: [\n            '<div class=\"my-arrow\"><i class=\"fas fa-arrow-alt-circle-left\"></i></i></div>',\n            '<div class=\"my-arrow\"><i class=\"fas fa-arrow-alt-circle-right\"></i></div>',\n        ]\n    });\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "examples/drag-and-move.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Drag And Move - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage auto-height example.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,auto-height,full-screen\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/fullPage/extensions/dragAndMove.html\" />\r\n</head>\r\n<body>\r\n\r\nRedirecting...\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/drop-effect.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>Drop Effect - fullPage.js</title>\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n    <meta name=\"description\" content=\"fullPage Drop Effect extension example.\" />\n    <meta name=\"keywords\"  content=\"fullpage,jquery,drop, drop-effect,screen,fullscreen,auto-height,full-screen\" />\n    <meta name=\"Resource-type\" content=\"Document\" />\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/fullPage/extensions/drop-effect.html\" />\n</head>\n<body>\n\nRedirecting...\n\n</body>\n</html>"
  },
  {
    "path": "examples/easing-css3.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>Easing - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage demo easing effect.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,demo,easing,effect,jqueui\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n<ul id=\"menu\">\r\n\t<li data-menuanchor=\"firstPage\"><a href=\"#firstPage\">First slide</a></li>\r\n\t<li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second slide</a></li>\r\n\t<li data-menuanchor=\"3rdPage\"><a href=\"#3rdPage\">Third slide</a></li>\r\n</ul>\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section \" id=\"section0\">\r\n\t\t<h1>fullPage.js</h1>\r\n\t\t<p>Configure the CSS3 easing effect!</p>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<img src=\"imgs/1.png\" alt=\"Cool\" />\r\n\t\t\t<h1>easeOutBack</h1>\r\n\t\t\t<p>This example is working with `easeOutBack` effect instead of the default</p>\r\n\t\t\t<p>You can see more about them <a href=\"http://jqueryui.com/resources/demos/effect/easing.html\" target=\"_blank\">here</a></p>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Cool uh?</h1>\r\n\t\t\t<p>Choose the best easing effect for your site!</p>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE', 'whitesmoke', '#ccddff'],\r\n        anchors: ['firstPage', 'secondPage', '3rdPage', '4thpage', 'lastPage'],\r\n        menu: '#menu',\r\n\r\n        //equivalent to jQuery `easeOutBack` extracted from http://matthewlein.com/ceaser/\r\n        easingcss3: 'cubic-bezier(0.175, 0.885, 0.320, 1.275)'\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "examples/easing-js.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<title>Easing - fullPage.js</title>\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n\t<meta name=\"description\" content=\"fullPage demo easing effect.\" />\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,demo,easing,effect,jqueui\" />\n\t<meta name=\"Resource-type\" content=\"Document\" />\n\n\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\n\n\t<!--[if IE]>\n\t\t<script type=\"text/javascript\">\n\t\t\t var console = { log: function() {} };\n\t\t</script>\n\t<![endif]-->\n</head>\n<body>\n\n<select id=\"demosMenu\">\n    <option selected>Choose Demo</option>\n    <option id=\"simple\">Simple</option>\n    <option id=\"custom-arrows\">Custom arrows</option>\n    <option id=\"hide-sections\">Hide sections</option>\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\n    <option id=\"observer\">Observer</option>\n    <option id=\"jquery-adapter\">jQuery adapter</option>\n    <option id=\"active-slide\">Active section and slide</option>\n    <option id=\"auto-height\">Auto height</option>\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\n    <option id=\"backgrounds\">Background images</option>\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\n    <option id=\"background-video\">Background video</option>\n    <option id=\"callbacks\">Callbacks</option>\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\n    <option id=\"continuous-vertical\">Continuous vertical</option>\n    <option id=\"parallax\">Parallax (premium)</option>\n    <option id=\"cards\">Cards 3d (premium)</option>\n    <option id=\"water-effect\">Water effect (premium)</option>\n    <option id=\"drop-effect\">Drop effect (premium)</option>\n    <option id=\"css3\">CSS3</option>\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\n    <option id=\"easing-css3\">Easing CSS</option>\n    <option id=\"easing-js\">Easing JS</option>\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\n    <option id=\"fixed-headers\">Fixed headers</option>\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\n    <option id=\"looping\">Looping</option>\n    <option id=\"methods\">Methods</option>\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\n    <option id=\"no-anchor\">No anchor links</option>\n    <option id=\"normal-scroll\">Normal scrolling</option>\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\n    <option id=\"offset-sections\">Offset sections (premium)</option>\n    <option id=\"one-section\">One single section</option>\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\n    <option id=\"responsive-height\">Responsive Height</option>\n    <option id=\"responsive-width\">Responsive Width</option>\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\n    <option id=\"scrollBar\">Scroll bar enabled</option>\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\n    <option id=\"lazy-load\">Lazy load</option>\n    <option id=\"scrolling-speed\">Scrolling speed</option>\n    <option id=\"rtl\">RTL</option>\n    <option id=\"trigger-animations\">Trigger animations</option>\n    <option id=\"vue-fullpage\">Vue component</option>\n    <option id=\"react-fullpage\">React component</option>\n    <option id=\"angular-fullpage\">Angular component</option>\n  </select>\n\n<ul id=\"menu\">\n\t<li data-menuanchor=\"firstPage\"><a href=\"#firstPage\">First slide</a></li>\n\t<li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second slide</a></li>\n\t<li data-menuanchor=\"3rdPage\"><a href=\"#3rdPage\">Third slide</a></li>\n</ul>\n\n<div id=\"fullpage\">\n\t<div class=\"section \" id=\"section0\">\n\t\t<h1>fullPage.js</h1>\n\t\t<p>Configure the CSS3 easing effect!</p>\n\t</div>\n\t<div class=\"section\" id=\"section1\">\n\t\t<div class=\"intro\">\n\t\t\t<img src=\"imgs/1.png\" alt=\"Cool\" />\n\t\t\t<h1>easeOutBack</h1>\n\t\t\t<p>This example is working with `easeOutBack` effect instead of the default</p>\n\t\t\t<p>You can see more about them <a href=\"http://jqueryui.com/resources/demos/effect/easing.html\" target=\"_blank\">here</a></p>\n\t\t</div>\n\t</div>\n\t<div class=\"section\" id=\"section2\">\n\t\t<div class=\"intro\">\n\t\t\t<h1>Cool uh?</h1>\n\t\t\t<p>Choose the best easing effect for your site!</p>\n\t\t</div>\n\t</div>\n</div>\n\n<!-- You will require to load a JS file defining each of the easings you want to use -->\n<script type=\"text/javascript\" src=\"../vendors/easings.js\"></script>\n\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\n<script type=\"text/javascript\" src=\"examples.js\"></script>\n<script type=\"text/javascript\">\n    var myFullpage = new fullpage('#fullpage', {\n        sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE', 'whitesmoke', '#ccddff'],\n        anchors: ['firstPage', 'secondPage', '3rdPage', '4thpage', 'lastPage'],\n        menu: '#menu',\n\n        // `easeInOutBack` is defined in `../vendors/easings.js`\n        easing: 'easeInOutBack',\n        css3: false\n    });\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "examples/effects.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>Slider Effects - fullPage.js</title>\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n    <meta name=\"description\" content=\"fullPage Slider Effects example.\" />\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,effects,slider,transitions\" />\n    <meta name=\"Resource-type\" content=\"Document\" />\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/fullPage/extensions/slider-effects.html\" />\n</head>\n<body>\n\nRedirecting...\n\n</body>\n</html>"
  },
  {
    "path": "examples/examples.css",
    "content": "@CHARSET \"ISO-8859-1\";\r\n/* Reset CSS\r\n * --------------------------------------- */\r\nbody,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,\r\nform,fieldset,input,textarea,p,blockquote,th,td {\r\n    padding: 0;\r\n    margin: 0;\r\n}\r\na{\r\n\ttext-decoration:none;\r\n}\r\ntable {\r\n    border-spacing: 0;\r\n}\r\nfieldset,img {\r\n    border: 0;\r\n}\r\naddress,caption,cite,code,dfn,em,strong,th,var {\r\n    font-weight: normal;\r\n    font-style: normal;\r\n}\r\nstrong{\r\n\tfont-weight: bold;\r\n}\r\nol,ul {\r\n    list-style: none;\r\n    margin:0;\r\n    padding:0;\r\n}\r\ncaption,th {\r\n    text-align: left;\r\n\r\n}\r\nh1,h2,h3,h4,h5,h6 {\r\n    font-weight: normal;\r\n    font-size: 100%;\r\n    margin:0;\r\n    padding:0;\r\n    color:#444;\r\n}\r\nq:before,q:after {\r\n    content:'';\r\n}\r\nabbr,acronym { border: 0;\r\n}\r\n\r\n\r\n/* Custom CSS\r\n * --------------------------------------- */\r\nbody{\r\n\tfont-family: arial,helvetica;\r\n\tcolor: #333;\r\n\tcolor: rgba(0,0,0,0.5);\r\n}\r\n.wrap{\r\n\tmargin-left: auto;\r\n\tmargin-right: auto;\r\n\twidth: 960px;\r\n\tposition: relative;\r\n}\r\nh1{\r\n\tfont-size: 6em;\r\n}\r\np{\r\n\tfont-size: 2em;\r\n}\r\n.intro p{\r\n\twidth: 50%;\r\n\tmargin: 0 auto;\r\n\tfont-size: 1.5em;\r\n}\r\n.section{\r\n\ttext-align:center;\r\n}\r\n#menu li {\r\n\tdisplay:inline-block;\r\n\tmargin: 10px;\r\n\tcolor: #000;\r\n\tbackground:#fff;\r\n\tbackground: rgba(255,255,255, 0.5);\r\n\t-webkit-border-radius: 10px;\r\n            border-radius: 10px;\r\n}\r\n#menu li.active{\r\n\tbackground:#666;\r\n\tbackground: rgba(0,0,0, 0.5);\r\n\tcolor: #fff;\r\n}\r\n#menu li a{\r\n\ttext-decoration:none;\r\n\tcolor: #000;\r\n}\r\n#menu li.active a:hover{\r\n\tcolor: #000;\r\n}\r\n#menu li:hover{\r\n\tbackground: rgba(255,255,255, 0.8);\r\n}\r\n#menu li a,\r\n#menu li.active a{\r\n\tpadding: 9px 18px;\r\n\tdisplay:block;\r\n}\r\n#menu li.active a{\r\n\tcolor: #fff;\r\n}\r\n#menu{\r\n\tposition:fixed;\r\n\ttop:0;\r\n\tleft:0;\r\n\theight: 40px;\r\n\tz-index: 70;\r\n\twidth: 100%;\r\n\tpadding: 0;\r\n\tmargin:0;\r\n}\r\n.twitter-share-button{\r\n\tposition: fixed !important;\r\n\tz-index: 99;\r\n\tright: 149px;\r\n\ttop: 9px;\r\n}\r\n#infoMenu{\r\n\theight: 20px;\r\n\tcolor: #f2f2f2;\r\n\tposition:fixed;\r\n\tz-index:70;\r\n\tbottom:0;\r\n\twidth:100%;\r\n\ttext-align:right;\r\n\tfont-size:0.9em;\r\n\tpadding:8px 0 8px 0;\r\n}\r\n#infoMenu ul{\r\n\tpadding: 0 40px;\r\n}\r\n#infoMenu li a{\r\n\tdisplay: block;\r\n\tmargin: 0 22px 0 0;\r\n\tcolor: #333;\r\n}\r\n#infoMenu li a:hover{\r\n\ttext-decoration:underline;\r\n}\r\n#infoMenu li{\r\n\tdisplay:inline-block;\r\n\tposition:relative;\r\n}\r\n#examplesList{\r\n\tdisplay:none;\r\n\tbackground: #282828;\r\n\t-webkit-border-radius: 6px;\r\n\t-moz-border-radius: 6px;\r\n\tborder-radius: 6px;\r\n\tpadding: 20px;\r\n\tfloat: left;\r\n\tposition: absolute;\r\n\tbottom: 29px;\r\n\tright: 0;\r\n\twidth:822px;\r\n\ttext-align:left;\r\n}\r\n#examplesList ul{\r\n\tpadding:0;\r\n}\r\n#examplesList ul li{\r\n\tdisplay:block;\r\n\tmargin: 5px 0;\r\n}\r\n#examplesList ul li a{\r\n\tcolor: #BDBDBD;\r\n\tmargin:0;\r\n}\r\n#examplesList ul li a:hover{\r\n\tcolor: #f2f2f2;\r\n}\r\n#examplesList .column{\r\n\tfloat: left;\r\n\tmargin: 0 20px 0 0;\r\n}\r\n#examplesList h3{\r\n\tcolor: #f2f2f2;\r\n\tfont-size: 1.2em;\r\n\tmargin: 0 0 15px 0;\r\n\tborder-bottom: 1px solid rgba(0, 0, 0, 0.4);\r\n\t-webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.1);\r\n\t-moz-box-shadow: 0 1px 0 rgba(255,255,255,0.1);\r\n\tbox-shadow: 0 1px 0 rgba(255, 255, 255, 0.1);\r\n\tpadding: 0 0 5px 0;\r\n}\r\n\r\n\r\n\r\n/* Demos Menu\r\n * --------------------------------------- */\r\n #demosMenu{\r\n\tposition:fixed;\r\n\ttop: 20px;\r\n\tright:20px;\r\n\tz-index: 999;\r\n\tpadding: 5px 10px;\r\n }\r\n\r\n/* Buttons\r\n * --------------------------------------- */\r\n#download a{\r\n    text-decoration: none\r\n}\r\n#download,\r\n#download:hover {\r\n    text-shadow: 0 -1px 0 rgba(0, 0, 0, .25)\r\n}\r\n.button {\r\n    margin: 20px 0 0 0;\r\n    vertical-align: middle;\r\n    display: inline-block\r\n}\r\n\r\n.button a {\r\n    color: #fff;\r\n    background: rgba(0,0,0,0.4);\r\n    padding: 15px 30px;\r\n    border-radius: 5px;\r\n    display: inline-block;\r\n}\r\n\r\n.button a:hover {\r\n    color: #316f68;\r\n    background-color: #fff\r\n}\r\n\r\n\r\n/* Extensions preview menu\r\n * --------------------------------------- */\r\n.preview-extensions-menu{\r\n\tposition: fixed;\r\n    top: 0;\r\n    right: 0;\r\n    z-index: 99;\r\n    border-top: 0;\r\n    box-shadow: 1px 0px 3px rgba(0,0,0,0.8);\r\n}\r\n.preview-extensions-menu li{\r\n\tdisplay: inline-block;\r\n\tmargin: 0;\r\n}\r\n.preview-extensions-menu li a{\r\n\tpadding: 15px 25px;\r\n\tdisplay: block;\r\n}\r\n.preview-buy-extension{\r\n    background: #3cc63c;\r\n}\r\n.preview-more-extensions{\r\n\tbackground: #fff;\r\n}\r\n.preview-buy-extension a{\r\n\tcolor: #fff;\r\n}\r\n.preview-buy-extension:hover{\r\n\tbackground-color: #1a961a;\r\n}\r\n.preview-more-extensions a{\r\n\tcolor: #333;\r\n}\r\n\r\n.code{\r\n\tbackground: rgba(255,255,255,0.7);\r\n\tpadding: 0px 5px;\r\n\tline-height: 25px;\r\n}\r\n\r\n\r\n/* Style for our header texts\r\n* --------------------------------------- */\r\nh1{\r\n\tfont-size: 5em;\r\n\tfont-family: arial,helvetica;\r\n\tcolor: #fff;\r\n\tmargin:0;\r\n}\r\n.section p,\r\n.intro p{\r\n\tcolor: #fff;\r\n}\r\n\r\n/* Centered texts in each section\r\n* --------------------------------------- */\r\n.section{\r\n\ttext-align:center;\r\n}\r\n\r\n\r\n/* Bottom menu\r\n* --------------------------------------- */\r\n#infoMenu li a {\r\n\tcolor: #fff;\r\n}\r\n\r\n/* Sections backgrounds\r\n* --------------------------------------- */\r\n#section0{\r\n\tbackground-image: linear-gradient(128deg,#40afff,#3f61ff);\r\n}\r\n\r\n#section1{\r\n\tbackground-image: linear-gradient(128deg,#ff9a3f,#ff4b40);\r\n}\r\n\r\n#section2{\r\n\tbackground-image: linear-gradient(128deg,#fc40ff,#543fff);\r\n}\r\n\r\n#section3{\r\n\tbackground-image: linear-gradient(128deg,#40fff2,#3fbcff);\r\n}"
  },
  {
    "path": "examples/examples.js",
    "content": "document.getElementById('demosMenu').addEventListener('change', function(e){\r\n    var dropdown = document.getElementById('demosMenu');\r\n    window.location.href = dropdown.options[dropdown.selectedIndex].getAttribute('id') + '.html';\r\n});"
  },
  {
    "path": "examples/fading-effect.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Fading Effect - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage Fading Effect example.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,auto-height,full-screen\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/fullPage/extensions/fading-effect.html\" />\r\n</head>\r\n<body>\r\n\r\nRedirecting...\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/fixed-headers.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>Fixed headers - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage fixed header and footer.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fixed, header,footer, absolute, positioned,css\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\t<style>\r\n\r\n\t/* Style for our header texts\r\n\t* --------------------------------------- */\r\n\th1{\r\n\t\tfont-size: 5em;\r\n\t\tfont-family: arial,helvetica;\r\n\t\tcolor: #fff;\r\n\t\tmargin:0;\r\n\t\tpadding:0;\r\n\t}\r\n\t.intro p{\r\n\t\tcolor: #fff;\r\n\t}\r\n\r\n\t/* Centered texts in each section\r\n\t* --------------------------------------- */\r\n\t.section{\r\n\t\ttext-align:center;\r\n\t}\r\n\r\n\t/* Fixed header and footer.\r\n\t* --------------------------------------- */\r\n\t#header, #footer{\r\n\t\tposition:fixed;\r\n\t\theight: 50px;\r\n\t\tdisplay:block;\r\n\t\twidth: 100%;\r\n\t\tbackground: #333;\r\n\t\tz-index:9;\r\n\t\ttext-align:center;\r\n\t\tcolor: #f2f2f2;\r\n\t\tpadding: 20px 0 0 0;\r\n\t}\r\n\r\n\t#header{\r\n\t\ttop:0px;\r\n\t}\r\n\t#footer{\r\n\t\tbottom:0px;\r\n\t}\r\n\r\n\r\n\t/* Bottom menu\r\n\t* --------------------------------------- */\r\n\t#infoMenu {\r\n\t\tbottom: 80px;\r\n\t}\r\n\t#infoMenu li a {\r\n\t\tcolor: #fff;\r\n\t\tz-index: 999;\r\n\t}\r\n\r\n\t</style>\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n\r\n<div id=\"header\">Header</div>\r\n<div id=\"footer\">Footer</div>\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section \" id=\"section0\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Fixed elements</h1>\r\n\t\t\t<p>Create your own headers and footers</p>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t    <div class=\"slide\" id=\"slide1\">\r\n\t\t\t<div class=\"intro\">\r\n\t\t\t\t<h1>How to do it</h1>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tYou will need to place your header and footer outside the plugin's wrapper.\r\n\t\t\t\t\tThis way it won't move on scrolling. Take a look at the source code of this page.\r\n\t\t\t\t</p>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t    <div class=\"slide\" id=\"slide2\">\r\n\t\t\t<div>\r\n\t\t\t\t<h1>Slide 2</h1>\r\n\t\t\t\t<img src=\"imgs/iphone-blue.png\" alt=\"iphone\" id=\"iphone-two\" />\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Enjoy it</h1>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        anchors: ['firstPage', 'secondPage', '3rdPage'],\r\n        sectionsColor: ['#C63D0F', '#1BBC9B', '#7E8F7C'],\r\n        css3: true\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/gradient-backgrounds.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>Gradient backgrounds - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage full-screen backgrounds.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,backgrounds,full-screen\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\t<style>\r\n\r\n\t/* Style for our header texts\r\n\t* --------------------------------------- */\r\n\th1{\r\n\t\tfont-size: 5em;\r\n\t\tfont-family: arial,helvetica;\r\n\t\tcolor: #fff;\r\n\t\tmargin:0;\r\n\t\tpadding:0;\r\n\t}\r\n\t.intro p{\r\n\t\tcolor: #fff;\r\n\t}\r\n\r\n\t/* Centered texts in each section\r\n\t* --------------------------------------- */\r\n\t.section{\r\n\t\ttext-align:center;\r\n\t}\r\n\r\n\r\n\r\n\t/* Defining each section background and styles\r\n\t* --------------------------------------- */\r\n\t#section0{\r\n\t\tbackground: -webkit-gradient(linear, top left, bottom left, from(#4bbfc3), to(#7baabe));\r\n\t\tbackground: -webkit-linear-gradient(#4BBFC3, #7BAABE);\r\n\t\tbackground: linear-gradient(#4BBFC3,#7BAABE);\r\n\t}\r\n\r\n\t#section2{\r\n\t\tbackground: -webkit-gradient(linear, top left, bottom left, from(#969ac6), to(#636F8F));\r\n\t\tbackground: -webkit-linear-gradient(#969AC6, #636F8F);\r\n\t\tbackground: linear-gradient(#969AC6,#636F8F);\r\n\t}\r\n\r\n\r\n\r\n \t/*Adding background for the slides\r\n\t* --------------------------------------- */\r\n\t#slide1{\r\n\t\tbackground: -webkit-gradient(linear, top left, bottom left, from(#7baabe), to(#969ac6));\r\n\t\tbackground: -webkit-linear-gradient(#7BAABE, #969AC6);\r\n\t\tbackground: linear-gradient(#7BAABE,#969AC6);\r\n\t}\r\n\t#slide2{\r\n\t\tbackground: -webkit-gradient(linear, top left, bottom left, from(#92a1ca), to(#76c2bd));\r\n\t\tbackground: -webkit-linear-gradient(#92a1ca, #76c2bd);\r\n\t\tbackground: linear-gradient(#92a1ca,#76c2bd);\r\n\t}\r\n\r\n\r\n\t/* Bottom menu\r\n\t* --------------------------------------- */\r\n\t#infoMenu li a {\r\n\t\tcolor: #fff;\r\n\t}\r\n\t</style>\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section \" id=\"section0\"><h1>Gradient backgrounds</h1></div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t    <div class=\"slide\" id=\"slide1\"><h1>Soft graduated colors</h1></div>\r\n\t    <div class=\"slide\" id=\"slide2\"><h1>Even for each slide if you want</h1></div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Feel free!</h1>\r\n\t\t\t<p>Using CSS3 gradients you can play as much as you want with graduated colors</p>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage');\r\n</script>\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/hide-sections.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<title>Observer - fullPage.js</title>\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n\t<meta name=\"description\" content=\"fullPage.js using CSS3 transformations.\" />\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,anchor,links,inside,demo,css,css3\" />\n\t<meta name=\"Resource-type\" content=\"Document\" />\n\n\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\n    <style>\n        /* Hidding sections under 960px width */\n        @media screen and (max-width: 960px) {\n            .hide-on-responsive{\n                display: none;\n            }\n        }\n\n        #fp-nav ul li a span, \n        .fp-slidesNav ul li a span{\n            background-color: white;\n        }\n        \n\n        .actions{\n            position: absolute;\n            z-index: 999;\n            top: 40px;\n            left: 50px;\n        }\n        .actions li{\n            display: inline-block;\n        }\n        .actions button {\n            padding: 0.93em 1.87em;\n            background: #35495e;\n            border-radius: 5px;\n            border: 0;\n            color: #fff;\n            margin: 7px;\n            font-size: 15px;\n            cursor: pointer;\n        }\n\n        .actions button:hover {\n            background: #fff;\n            color: #35495e;\n        }\n    </style>\n</head>\n<body>\n\n\n<select id=\"demosMenu\">\n    <option selected>Choose Demo</option>\n    <option id=\"simple\">Simple</option>\n    <option id=\"custom-arrows\">Custom arrows</option>\n    <option id=\"hide-sections\">Hide sections</option>\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\n    <option id=\"observer\">Observer</option>\n    <option id=\"jquery-adapter\">jQuery adapter</option>\n    <option id=\"active-slide\">Active section and slide</option>\n    <option id=\"auto-height\">Auto height</option>\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\n    <option id=\"backgrounds\">Background images</option>\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\n    <option id=\"background-video\">Background video</option>\n    <option id=\"callbacks\">Callbacks</option>\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\n    <option id=\"continuous-vertical\">Continuous vertical</option>\n    <option id=\"parallax\">Parallax (premium)</option>\n    <option id=\"cards\">Cards 3d (premium)</option>\n    <option id=\"water-effect\">Water effect (premium)</option>\n    <option id=\"drop-effect\">Drop effect (premium)</option>\n    <option id=\"css3\">CSS3</option>\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\n    <option id=\"easing-css3\">Easing CSS</option>\n    <option id=\"easing-js\">Easing JS</option>\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\n    <option id=\"fixed-headers\">Fixed headers</option>\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\n    <option id=\"looping\">Looping</option>\n    <option id=\"methods\">Methods</option>\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\n    <option id=\"no-anchor\">No anchor links</option>\n    <option id=\"normal-scroll\">Normal scrolling</option>\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\n    <option id=\"offset-sections\">Offset sections (premium)</option>\n    <option id=\"one-section\">One single section</option>\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\n    <option id=\"responsive-height\">Responsive Height</option>\n    <option id=\"responsive-width\">Responsive Width</option>\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\n    <option id=\"scrollBar\">Scroll bar enabled</option>\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\n    <option id=\"lazy-load\">Lazy load</option>\n    <option id=\"scrolling-speed\">Scrolling speed</option>\n    <option id=\"rtl\">RTL</option>\n    <option id=\"trigger-animations\">Trigger animations</option>\n    <option id=\"vue-fullpage\">Vue component</option>\n    <option id=\"react-fullpage\">React component</option>\n    <option id=\"angular-fullpage\">Angular component</option>\n  </select>\n\n\n<div id=\"fullpage\">\n    <div class=\"section\" id=\"section0\">\n        <h1>fullPage.js 1</h1>\n\t\t    <p>\n                Hide and show sections.<br>\n                fullPage.js will get updated automatically.\n            </p>\n    </div>\n\t<div class=\"section\" id=\"section1\">\n        <div class=\"slide hide-on-responsive\">\n            <h1>Slide To Hide On Responsive</h1>\n\t\t\t<p>\n                This slide will get hidden when reaching 960px width.<br />\n                We are using CSS to hide the sections. <br />\n                But fullPage.js will notice the change and update accordingly.\n\t\t\t</p>\n        </div>\n        <div class=\"slide\">\n            <h1>Cool uh?</h1>\n\t\t    <p>fullPage.js listen to your DOM!</p>\n        </div>\n\n\t\t\n\t</div>\n\t<div class=\"section hide-on-responsive\" id=\"section2\">\n\t\t<div class=\"intro\">\n\t\t\t<h1>To Hide On Responsive</h1>\n\t\t\t<p>\n                This section will get hidden when reaching 960px width.<br />\n                We are using CSS to hide the sections. <br />\n                But fullPage.js will notice the change and update accordingly.\n\t\t\t</p>\n\t\t</div>\n\t</div>\n\t<div class=\"section \" id=\"section3\">\n\t\t<div class=\"intro\">\n\t\t\t<h1>Check it out!</h1>\n\t\t\t<p>You'll love it</p>\n\t\t</div>\n\t</div>\n</div>\n\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\n<script type=\"text/javascript\" src=\"examples.js\"></script>\n<script type=\"text/javascript\">\n    var myFullpage = new fullpage('#fullpage', {\n        sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE', '#435b71', 'orange', 'blue', 'purple', 'yellow', '#435b71', 'orange', 'blue', 'purple', 'yellow' ],\n        anchors: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13'],\n        controlArrows: false,\n        navigation: true,\n        slidesNavigation: true\n    });  \n    \n\n\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "examples/imgs/copyright.txt",
    "content": "Background images used in the examples were extracted from:\r\n\r\nhttp://good-wallpapers.com/art/4121\r\nhttp://files.all-free-download.com/downloadfiles/wallpapers/1920_1200_widescreen/old_farm_wallpaper_landscape_nature_wallpaper_1920_1200_widescreen_1439.jpg\r\nhttp://www.hdwallpaperstop.com/wp-content/uploads/2013/05/Beautiful-Landscape-Pictures-of-nature.jpg\r\nhttp://duggal.com/connect/wp-content/uploads/2013/06/Landscape-Nature-for-Wallpaper-Dekstop-.jpg\r\nhttp://www.imgbase.info/images/safe-wallpapers/digital_art/3d_landscape/9659_3d_landscape.jpg"
  },
  {
    "path": "examples/interlocked-slides.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Interlocked Slides - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage auto-height example.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,auto-height,full-screen\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/fullPage/extensions/interlocked-slides.html\" />\r\n</head>\r\n<body>\r\n\r\nRedirecting...\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/jquery-adapter.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>jQuery Adapter - fullPage.js</title>\n    <meta name=\"author\" content=\"Matthew Howell\" />\n    <meta name=\"description\" content=\"fullPage continuous scrolling demo.\" />\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,scroll,loop,continuous\" />\n    <meta name=\"Resource-type\" content=\"Document\" />\n\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\n    <style>\n        .actions{\n            position: absolute;\n            z-index: 999;\n            top: 70px;\n            left: 50px;\n        }\n        .actions li{\n            display: inline-block;\n        }\n        .actions button {\n            padding: 0.93em 1.87em;\n            background: #35495e;\n            border-radius: 5px;\n            border: 0;\n            color: #fff;\n            margin: 7px;\n            font-size: 15px;\n            cursor: pointer;\n        }\n\n        .actions button:hover {\n            background: #fff;\n            color: #35495e;\n        }\n    </style>\n\n    <!--[if IE]>\n        <script type=\"text/javascript\">\n             var console = { log: function() {} };\n        </script>\n    <![endif]-->\n\n    <script\n    src=\"https://code.jquery.com/jquery-3.6.0.min.js\"\n    integrity=\"sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=\"\n    crossorigin=\"anonymous\"></script>\n    \n    <script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\n\n    <script type=\"text/javascript\">\n        //using document ready...\n        $(document).ready(function(){\n\n            //initialising fullpage.js in the jQuery way\n            $('#fullpage').fullpage({\n                sectionsColor: ['#ff5f45', '#0798ec', '#fc6c7c', '#fec401'],\n                navigation: true,\n                slidesNavigation: true,\n            });\n\n            // calling fullpage.js methods using jQuery\n            $('#moveSectionUp').click(function(e){\n                e.preventDefault();\n                $.fn.fullpage.moveSectionUp();\n            });\n\n            $('#moveSectionDown').click(function(e){\n                e.preventDefault();\n                $.fn.fullpage.moveSectionDown();\n            });\n        });\n    </script>\n</head>\n<body>\n\n<select id=\"demosMenu\">\n    <option selected>Choose Demo</option>\n    <option id=\"simple\">Simple</option>\n    <option id=\"custom-arrows\">Custom arrows</option>\n    <option id=\"hide-sections\">Hide sections</option>\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\n    <option id=\"observer\">Observer</option>\n    <option id=\"jquery-adapter\">jQuery adapter</option>\n    <option id=\"active-slide\">Active section and slide</option>\n    <option id=\"auto-height\">Auto height</option>\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\n    <option id=\"backgrounds\">Background images</option>\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\n    <option id=\"background-video\">Background video</option>\n    <option id=\"callbacks\">Callbacks</option>\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\n    <option id=\"continuous-vertical\">Continuous vertical</option>\n    <option id=\"parallax\">Parallax (premium)</option>\n    <option id=\"cards\">Cards 3d (premium)</option>\n    <option id=\"water-effect\">Water effect (premium)</option>\n    <option id=\"drop-effect\">Drop effect (premium)</option>\n    <option id=\"css3\">CSS3</option>\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\n    <option id=\"easing-css3\">Easing CSS</option>\n    <option id=\"easing-js\">Easing JS</option>\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\n    <option id=\"fixed-headers\">Fixed headers</option>\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\n    <option id=\"looping\">Looping</option>\n    <option id=\"methods\">Methods</option>\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\n    <option id=\"no-anchor\">No anchor links</option>\n    <option id=\"normal-scroll\">Normal scrolling</option>\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\n    <option id=\"offset-sections\">Offset sections (premium)</option>\n    <option id=\"one-section\">One single section</option>\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\n    <option id=\"responsive-height\">Responsive Height</option>\n    <option id=\"responsive-width\">Responsive Width</option>\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\n    <option id=\"scrollBar\">Scroll bar enabled</option>\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\n    <option id=\"lazy-load\">Lazy load</option>\n    <option id=\"scrolling-speed\">Scrolling speed</option>\n    <option id=\"rtl\">RTL</option>\n    <option id=\"trigger-animations\">Trigger animations</option>\n    <option id=\"vue-fullpage\">Vue component</option>\n    <option id=\"react-fullpage\">React component</option>\n    <option id=\"angular-fullpage\">Angular component</option>\n  </select>\n\n<ul id=\"menu\">\n    <li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">First slide</a></li>\n    <li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second slide</a></li>\n    <li data-menuanchor=\"3rdPage\"><a href=\"#3rdPage\">Third slide</a></li>\n</ul>\n\n<ul class=\"actions\">\n    <li><button id=\"moveSectionUp\">Move Section Up</button></li>\n    <li><button id=\"moveSectionDown\">Move Section Down</button></li>\n</ul>\n\n<div id=\"fullpage\">\n    <div class=\"section\">\n        <div class=\"intro\">\n            <h1>jQuery adaptor</h1>\n            <p>You can use fullpage.js as a jQuery plugin!</p>\n            <p>Read <a href=\"https://github.com/alvarotrigo/fullPage.js#initialization\">the docs</a> for more info!</p>\n        </div>\n    </div>\n    <div class=\"section\">\n        <div class=\"slide\"><h1>Section 2.1</h1></div>\n        <div class=\"slide\"><h1>Section 2.2</h1></div>\n        <div class=\"slide\"><h1>Section 2.3</h1></div>\n    </div>\n    <div class=\"section\">\n        <h1>Section 3</h1>\n    </div>\n    <div class=\"section\">\n        <h1>Section 4</h1>\n    </div>\n</div>\n\n<script type=\"text/javascript\" src=\"examples.js\"></script>\n\n</body>\n</html>"
  },
  {
    "path": "examples/lazy-load.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Lazy load - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage Lazy Load Demo.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,lazyload,lazy,passive,load,src,data-src,media\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n    <style>\r\n\r\n    /* Style for our header texts\r\n    * --------------------------------------- */\r\n    h1{\r\n        font-size: 5em;\r\n        font-family: arial,helvetica;\r\n        color: #fff;\r\n        margin:0;\r\n    }\r\n    .intro p{\r\n        color: #fff;\r\n    }\r\n\r\n    /* Centered texts in each section\r\n    * --------------------------------------- */\r\n    .section{\r\n        text-align:center;\r\n    }\r\n\r\n\r\n    /* Bottom menu\r\n    * --------------------------------------- */\r\n    #infoMenu li a {\r\n        color: #fff;\r\n    }\r\n\r\n    /* Lazy loading background\r\n    * --------------------------------------- */\r\n    #section2.load-background{\r\n      background-image: url(imgs/bg2.jpg);\r\n      background-size: cover;\r\n    }\r\n\r\n    </style>\r\n\r\n    <!--[if IE]>\r\n        <script type=\"text/javascript\">\r\n             var console = { log: function() {} };\r\n        </script>\r\n    <![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n<ul id=\"menu\">\r\n    <li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">First slide</a></li>\r\n    <li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second slide</a></li>\r\n    <li data-menuanchor=\"3rdPage\"><a href=\"#3rdPage\">Third slide</a></li>\r\n</ul>\r\n\r\n<div id=\"fullpage\">\r\n    <div class=\"section \" id=\"section0\">\r\n        <div class=\"intro\">\r\n            <img data-srcset=\"imgs/1.png, imgs/2.png\"  alt=\"1\"/>\r\n            <h1>Lazy load</h1>\r\n            <p>Just use `data-src` or `data-srcset` for media elements.</p>\r\n        </div>\r\n    </div>\r\n    <div class=\"section \"id=\"section1\">\r\n        <div class=\"intro\">\r\n            <img data-srcset=\"imgs/2.png, imgs/2.png\"  alt=\"1\"/>\r\n            <h1>Section 2</h1>\r\n        </div>\r\n    </div>\r\n    <div class=\"section active\" id=\"section2\">\r\n        <div class=\"intro\">\r\n            <img data-srcset=\"imgs/3.png, imgs/2.png\"  alt=\"1\"/>\r\n            <h1>Section 3</h1>\r\n        </div>\r\n    </div>\r\n    <div class=\"section\" id=\"section4\">\r\n        <div class=\"slide\" id=\"slide1\">\r\n            <div class=\"intro\">\r\n                <h1>Section 4</h1>\r\n                <img data-src=\"imgs/iphone-blue.png\" alt=\"iphone\" id=\"iphone-two\" />\r\n            </div>\r\n        </div>\r\n\r\n        <div class=\"slide\" id=\"slide2\">\r\n            <div>\r\n                <h1>Lazy load video</h1>\r\n                <video loop muted controls=\"false\" data-autoplay>\r\n                  <source data-src=\"http://www.w3schools.com/html/mov_bbb.mp4\" type=\"video/mp4\">\r\n                  <source data-src=\"http://www.w3schools.com/html/mov_bbb.ogg\" type=\"video/ogg\">\r\n                </video>\r\n            </div>\r\n        </div>\r\n\r\n    </div>\r\n    <div class=\"section\" id=\"section5\">\r\n        <div class=\"intro\">\r\n            <h1>Lazy load background </h1>\r\n            <p>Make use of the `onLeave` callback. See the source code here!</p>\r\n        </div>\r\n    </div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n\r\n        // Lazyload default values\r\n        lazyLoading: true,\r\n        lazyLoadThreshold: 3,\r\n\r\n        // To lazy load a background\r\n        onLeave: function(origin, destination, direction){\r\n          if(destination.index === 2){\r\n             destination.item.classList.add('load-background');\r\n          }\r\n        },\r\n\r\n        // Optional\r\n        menu: '#menu',\r\n        anchors: ['firstPage', 'secondPage', '3rdPage', '4page', '5page', '6page', '7page'],\r\n        sectionsColor: ['#C63D0F', '#1BBC9B', '#7E8F7C','#C63D0F', '#1BBC9B', '#7E8F7C','#C63D0F', '#1BBC9B', '#7E8F7C'],\r\n        navigation: true       \r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/looping.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>Looping - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage looping demo.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,looping,loop,loopTop,loopBottom,demo\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n<ul id=\"menu\">\r\n\t<li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">First slide</a></li>\r\n\t<li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second slide</a></li>\r\n\t<li data-menuanchor=\"3rdPage\"><a href=\"#3rdPage\">Third slide</a></li>\r\n</ul>\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section \" id=\"section0\">\r\n\t\t<h1>fullPage.js</h1>\r\n\t\t<p>Looping Top and Bottom Enabled</p>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Looping!</h1>\r\n\t\t\t<p>Go to the first section and scroll up or to the last one and scroll down to see how it works.</p>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Scroll Down</h1>\r\n\t\t\t<p>And it will loop to the first section</p>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE'],\r\n        anchors: ['firstPage', 'secondPage', '3rdPage'],\r\n        menu: '#menu',\r\n        loopTop: true,\r\n        loopBottom: true\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "examples/methods.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>Methods - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage methods demo.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,methods,callbacks,demo\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n\r\n\t<style>\r\n\t\t#actions{\r\n\t\t\tposition:fixed;\r\n\t\t\ttop: 73px;\r\n\t\t\tleft: 30px;\r\n\t\t\tz-index: 99999;\r\n\t\t}\r\n\t\t#actions a{\r\n\t\t\tbackground: rgba(0,0,0,0.8);\r\n\t\t\tpadding: 7px;\r\n\t\t\tmargin: 2px;\r\n\t\t\tcolor: #ccc;\r\n\t\t\tdisplay: inline-block;\r\n\t\t}\r\n\t\t#actions a:hover{\r\n\t\t\tcolor: #fff;\r\n\t\t\tbackground: #81A140;\r\n\t\t}\r\n\r\n\t\t/* Overwriting styles for control arrows for slides\r\n\t\t* --------------------------------------- */\r\n\t\t.fp-controlArrow.fp-prev {\r\n\t\t\tleft: 50px;\r\n\t\t}\r\n\t\t.fp-controlArrow.fp-next{\r\n\t\t\tright: 50px;\r\n\t\t}\r\n\t</style>\r\n\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n\r\n<div id=\"actions\">\r\n\t<a id=\"moveSectionUp\" href=\"#\">moveSectionUp</a>\r\n\t<a id=\"moveSectionDown\" href=\"#\">moveSectionDown</a>\r\n\t<a id=\"silentMoveTo\" href=\"#\">silentMoveTo(2)</a>\r\n\t<a id=\"moveTo\" href=\"#\">moveTo(2,3)</a>\r\n\t<a id=\"silentMoveToSlide\" href=\"#\">silentMoveTo(2,3)</a>\r\n\t<a id=\"moveSlideRight\" href=\"#\">moveSlideRight</a>\r\n\t<a id=\"moveSlideLeft\" href=\"#\">moveSlideLeft</a>\r\n\t<a id=\"setAutoScrollingTrue\" href=\"#\">setAutoScrolling(true)</a>\r\n\t<a id=\"setAutoScrollingFalse\" href=\"#\">setAutoScrolling(false)</a>\r\n\t<a id=\"setAllowScrollingTrue\" href=\"#\">setAllowScrolling(true)</a>\r\n\t<a id=\"setAllowScrollingFalse\" href=\"#\">setAllowScrolling(false)</a>\r\n\t<a id=\"setKeyboardScrollingTrue\" href=\"#\">setKeyboardScrolling(true)</a>\r\n\t<a id=\"setKeyboardScrollingFalse\" href=\"#\">setKeyboardScrolling(false)</a>\r\n\t<a id=\"setScrollingSpeed1500\" href=\"#\">setScrollingSpeed(1500)</a>\r\n\t<a id=\"setScrollingSpeed700\" href=\"#\">setScrollingSpeed(700)</a>\r\n\t<a id=\"destroy\" href=\"#\">destroy('all')</a>\r\n\t<a id=\"undestroy\" href=\"#\">undestroy</a>\r\n\t<a id=\"reBuild\" href=\"#\">reBuild</a>\r\n\t<a id=\"setLockAnchorsTrue\" href=\"#\">setLockAnchors(true)</a>\r\n\t<a id=\"setLockAnchorsFalse\" href=\"#\">setLockAnchors(false)</a>\r\n</div>\r\n\r\n\r\n<ul id=\"menu\">\r\n\t<li data-menuanchor=\"firstPage\"><a href=\"#firstPage\">First slide</a></li>\r\n\t<li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second slide</a></li>\r\n\t<li data-menuanchor=\"3rdPage\"><a href=\"#3rdPage\">Third slide</a></li>\r\n\t<li data-menuanchor=\"4thpage\"><a href=\"#4thpage\">Fourth slide</a></li>\r\n</ul>\r\n<div id=\"myContainer\">\r\n\r\n\t<div class=\"section\" id=\"section0\">\r\n\t\t<div class=\"slide\" id =\"slide1.1\">\r\n\t\t\t<h1>Section 1</h1>\r\n\t\t</div>\r\n\t\t<div class=\"slide\" id=\"slide1.2\"><h1>Slide 1.2</h1></div>\r\n\t\t<div class=\"slide\" id=\"slide1.3\"><h1>Slide 1.3</h1></div>\r\n\t\t</div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t\t<div class=\"slide\"><h1>Section 2</h1></div>\r\n\t\t<div class=\"slide\"><div class=\"wrap\"><h1>Slide 2.1</h1></div></div>\r\n\t\t<div class=\"slide\"><h1>Slide 2.2</h1></div>\r\n\t\t<div class=\"slide\"><h1>Slide 2.3</h1></div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\"><h1>Section 3</h1></div>\r\n\t<div class=\"section\" id=\"section3\"><h1>Section 4</h1></div>\r\n</div>\r\n\r\n\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n<script type=\"text/javascript\">\r\n\tfunction initialization(){\r\n\t\tvar myFullpage = new fullpage('#myContainer', {\r\n\t\t\tsectionsColor: ['#4A6FB1', '#4BBFC3', '#7BAABE', 'whitesmoke', '#ccddff'],\r\n\t\t\tanchors: ['firstPage', 'secondPage', '3rdPage', '4thpage', 'lastPage'],\r\n\t\t\tresize: false,\r\n\t\t\tanimateAnchor:false,\r\n\t\t\tscrollOverflow: true,\r\n\t\t\tautoScrolling:true,\r\n\t\t\tresponsive: 900,\r\n\t\t\tfitSection: false,\r\n\t\t\tmenu: '#menu',\r\n\t\t\tnavigation:true,\r\n\t\t\tcontinuousVertical:true,\r\n\t\t\tpaddingTop: '20px'\r\n\t\t});\r\n\t}\r\n\r\n\t//fullPage.js initialization\r\n\tinitialization();\r\n\r\n\r\n\tdocument.querySelector('#moveSectionUp').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.moveSectionUp();\r\n\t});\r\n\r\n\tdocument.querySelector('#moveSectionDown').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.moveSectionDown();\r\n\t});\r\n\r\n\tdocument.querySelector('#moveTo').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.moveTo(2, 3);\r\n\t});\r\n\r\n\tdocument.querySelector('#silentMoveTo').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.silentMoveTo(2);\r\n\t});\r\n\r\n\tdocument.querySelector('#silentMoveToSlide').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.silentMoveTo(2, 3);\r\n\t});\r\n\r\n\tdocument.querySelector('#moveSlideRight').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.moveSlideRight();\r\n\t});\r\n\r\n\tdocument.querySelector('#moveSlideLeft').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.moveSlideLeft();\r\n\t});\r\n\r\n\tdocument.querySelector('#setAutoScrollingFalse').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.setAutoScrolling(false);\r\n\t});\r\n\r\n\tdocument.querySelector('#setAutoScrollingTrue').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.setAutoScrolling(true);\r\n\t});\r\n\r\n\tdocument.querySelector('#setAllowScrollingFalse').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.setAllowScrolling(false);\r\n\t});\r\n\r\n\tdocument.querySelector('#setAllowScrollingTrue').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.setAllowScrolling(true);\r\n\t});\r\n\r\n\tdocument.querySelector('#setKeyboardScrollingFalse').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.setKeyboardScrolling(false);\r\n\t});\r\n\r\n\tdocument.querySelector('#setKeyboardScrollingTrue').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.setKeyboardScrolling(true);\r\n\t});\r\n\r\n\tdocument.querySelector('#setScrollingSpeed1500').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.setScrollingSpeed(2500);\r\n\t});\r\n\r\n\tdocument.querySelector('#setScrollingSpeed700').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.setScrollingSpeed(700);\r\n\t});\r\n\r\n\tdocument.querySelector('#destroy').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.destroy('all');\r\n\t});\r\n\r\n\tdocument.querySelector('#undestroy').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\r\n\t\t//fullPage.js initialization\r\n\t\tinitialization();\r\n\t});\r\n\r\n\tdocument.querySelector('#reBuild').addEventListener('click', function(e){\r\n\t\te.preventDefault();\r\n\t\tfullpage_api.reBuild();\r\n\t});\r\n\r\n\tdocument.querySelector('#setLockAnchorsTrue').addEventListener('click', function(e){\r\n\t\te.preventDefault;\r\n\t\tfullpage_api.setLockAnchors(true);\r\n\t});\r\n\r\n\tdocument.querySelector('#setLockAnchorsFalse').addEventListener('click', function(e){\r\n\t\te.preventDefault;\r\n\t\tfullpage_api.setLockAnchors(false);\r\n\t});\r\n</script>\r\n\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "examples/module_loaders/browserify-example/README.md",
    "content": "# Browserify example for fullPage.js\n\n### Creating the bundle file\n\nIn order to create the bundle file `main.js` run the following command inside the root folder:\n\n```sh\nnpm run build\n```\n\nThen run:\n```sh\nnpm run build\n```\n\nWhich runs the comand specified in `package.json`:\n\n```sh\nbrowserify src/index.js > dist/main.js\n```\n\n### Importing files\n\n```javascript\n// Optional. When using fullPage extensions\n//require('./fullpage.scrollHorizontally.min');\n\n// Optional. When using scrollOverflow:true\n//require('fullpage.js/vendors/scrolloverflow');\n\nvar fullpage = require('fullpage.js');\n\n// When using fullPage extensions replace the previos require\n// of fullpage.js for this file\n//var fullpage = require('fullpage.js/dist/fullpage.extensions.min');\n\n// Initializing it\nvar fullPageInstance = new fullpage('#myFullpage', {\n    navigation: true,\n    sectionsColor:['#ff5f45', '#0798ec', '#fc6c7c', 'grey']\n});\n```\n"
  },
  {
    "path": "examples/module_loaders/browserify-example/dist/index.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>Browserify example for fullPage.js</title>\n     <link rel=\"stylesheet\" type=\"text/css\" href=\"../node_modules/fullpage.js/dist/fullpage.min.css\" />\n    <style type=\"text/css\">\n        .section{\n            font-size: 3.5em;\n            font-family: arial;\n            color: #fff;\n            text-align: center;\n        }\n    </style>\n  </head>\n  <body>\n\n    <div id=\"myFullpage\">\n      <div class=\"section\">Section 1</div>\n        <div class=\"section\">\n            <div class=\"slide\">Slide 2.1</div>\n            <div class=\"slide\">Slide 2.2</div>\n            <div class=\"slide\">Slide 2.3</div>\n        </div>\n        <div class=\"section\">Section 3</div>\n    </div>\n\n    <script src=\"main.js\"></script>\n  </body>\n</html>"
  },
  {
    "path": "examples/module_loaders/browserify-example/dist/main.js",
    "content": "(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n/*!\n* fullPage 4.0.20\n* https://github.com/alvarotrigo/fullPage.js\n*\n* @license GPLv3 for open source use only\n* or Fullpage Commercial License for commercial use\n* http://alvarotrigo.com/fullPage/pricing/\n*\n* Copyright (C) 2018 http://alvarotrigo.com/fullPage - A project by Alvaro Trigo\n*/\n\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.fullpage = factory());\n})(this, (function () { 'use strict';\n\n    // https://tc39.github.io/ecma262/#sec-array.prototype.find\n    if (!Array.prototype.find) {\n      Object.defineProperty(Array.prototype, 'find', {\n        value: function value(predicate) {\n          // 1. Let O be ? ToObject(this value).\n          if (this == null) {\n            throw new TypeError('\"this\" is null or not defined');\n          }\n\n          var o = Object(this); // 2. Let len be ? ToLength(? Get(O, \"length\")).\n\n          var len = o.length >>> 0; // 3. If IsCallable(predicate) is false, throw a TypeError exception.\n\n          if (typeof predicate !== 'function') {\n            throw new TypeError('predicate must be a function');\n          } // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.\n\n\n          var thisArg = arguments[1]; // 5. Let k be 0.\n\n          var k = 0; // 6. Repeat, while k < len\n\n          while (k < len) {\n            // a. Let Pk be ! ToString(k).\n            // b. Let kValue be ? Get(O, Pk).\n            // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).\n            // d. If testResult is true, return kValue.\n            var kValue = o[k];\n\n            if (predicate.call(thisArg, kValue, k, o)) {\n              return kValue;\n            } // e. Increase k by 1.\n\n\n            k++;\n          } // 7. Return undefined.\n\n\n          return undefined;\n        }\n      });\n    }\n\n    // Production steps of ECMA-262, Edition 6, 22.1.2.1\n    if (!Array.from) {\n      Array.from = function () {\n        var toStr = Object.prototype.toString;\n\n        var isCallable = function isCallable(fn) {\n          return typeof fn === 'function' || toStr.call(fn) === '[object Function]';\n        };\n\n        var toInteger = function toInteger(value) {\n          var number = Number(value);\n\n          if (isNaN(number)) {\n            return 0;\n          }\n\n          if (number === 0 || !isFinite(number)) {\n            return number;\n          }\n\n          return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));\n        };\n\n        var maxSafeInteger = Math.pow(2, 53) - 1;\n\n        var toLength = function toLength(value) {\n          var len = toInteger(value);\n          return Math.min(Math.max(len, 0), maxSafeInteger);\n        }; // The length property of the from method is 1.\n\n\n        return function from(arrayLike\n        /*, mapFn, thisArg */\n        ) {\n          // 1. Let C be the this value.\n          var C = this; // 2. Let items be ToObject(arrayLike).\n\n          var items = Object(arrayLike); // 3. ReturnIfAbrupt(items).\n\n          if (arrayLike == null) {\n            throw new TypeError('Array.from requires an array-like object - not null or undefined');\n          } // 4. If mapfn is undefined, then let mapping be false.\n\n\n          var mapFn = arguments.length > 1 ? arguments[1] : void undefined;\n          var T;\n\n          if (typeof mapFn !== 'undefined') {\n            // 5. else\n            // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.\n            if (!isCallable(mapFn)) {\n              throw new TypeError('Array.from: when provided, the second argument must be a function');\n            } // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.\n\n\n            if (arguments.length > 2) {\n              T = arguments[2];\n            }\n          } // 10. Let lenValue be Get(items, \"length\").\n          // 11. Let len be ToLength(lenValue).\n\n\n          var len = toLength(items.length); // 13. If IsConstructor(C) is true, then\n          // 13. a. Let A be the result of calling the [[Construct]] internal method\n          // of C with an argument list containing the single item len.\n          // 14. a. Else, Let A be ArrayCreate(len).\n\n          var A = isCallable(C) ? Object(new C(len)) : new Array(len); // 16. Let k be 0.\n\n          var k = 0; // 17. Repeat, while k < len… (also steps a - h)\n\n          var kValue;\n\n          while (k < len) {\n            kValue = items[k];\n\n            if (mapFn) {\n              A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);\n            } else {\n              A[k] = kValue;\n            }\n\n            k += 1;\n          } // 18. Let putStatus be Put(A, \"length\", len, true).\n\n\n          A.length = len; // 20. Return A.\n\n          return A;\n        };\n      }();\n    }\n\n    var win = window;\n    var doc = document;\n    var isTouchDevice = navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/);\n    var isMacDevice = /(Mac|iPhone|iPod|iPad)/i.test(win.navigator.userAgent); // @ts-ignore\n\n    var isTouch = 'ontouchstart' in win || navigator.msMaxTouchPoints > 0 || navigator.maxTouchPoints;\n    var isIE11 = !!window.MSInputMethodContext && !!document.documentMode; // taken from https://github.com/udacity/ud891/blob/gh-pages/lesson2-focus/07-modals-and-keyboard-traps/solution/modal.js\n\n    var focusableElementsString = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex=\"0\"], [contenteditable]'; // cache common elements\n\n    var FP = {\n      test: {},\n      shared: {}\n    };\n    var extensions = ['parallax', 'scrollOverflowReset', 'dragAndMove', 'offsetSections', 'fadingEffect', 'responsiveSlides', 'continuousHorizontal', 'interlockedSlides', 'scrollHorizontally', 'resetSliders', 'cards', 'dropEffect', 'waterEffect'];\n\n    /**\n    * forEach polyfill for IE\n    * https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach#Browser_Compatibility\n    */\n\n    if (win.NodeList && !NodeList.prototype.forEach) {\n      NodeList.prototype.forEach = function (callback, thisArg) {\n        thisArg = thisArg || window;\n\n        for (var i = 0; i < this.length; i++) {\n          callback.call(thisArg, this[i], i, this);\n        }\n      };\n    }\n\n    if (typeof Object.assign != 'function') {\n      // Must be writable: true, enumerable: false, configurable: true\n      Object.defineProperty(Object, 'assign', {\n        value: function assign(target, varArgs) {\n\n          if (target == null) {\n            // TypeError if undefined or null\n            throw new TypeError('Cannot convert undefined or null to object');\n          }\n\n          var to = Object(target);\n\n          for (var index = 1; index < arguments.length; index++) {\n            var nextSource = arguments[index];\n\n            if (nextSource != null) {\n              // Skip over if undefined or null\n              for (var nextKey in nextSource) {\n                // Avoid bugs when hasOwnProperty is shadowed\n                if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n                  to[nextKey] = nextSource[nextKey];\n                }\n              }\n            }\n          }\n\n          return to;\n        },\n        writable: true,\n        configurable: true\n      });\n    }\n\n    // https://stackoverflow.com/questions/51719553/padstart-not-working-in-ie11\n    // https://github.com/behnammodi/polyfill/blob/master/string.polyfill.js\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart\n    if (!String.prototype.padStart) {\n      String.prototype.padStart = function padStart(targetLength, padString) {\n        targetLength = targetLength >> 0; //truncate if number or convert non-number to 0;\n\n        padString = String(typeof padString !== 'undefined' ? padString : ' ');\n\n        if (this.length > targetLength) {\n          return String(this);\n        } else {\n          targetLength = targetLength - this.length;\n\n          if (targetLength > padString.length) {\n            padString += Array.apply(null, Array(targetLength)).map(function () {\n              return padString;\n            }).join(\"\");\n          }\n\n          return padString.slice(0, targetLength) + String(this);\n        }\n      };\n    }\n\n    //utils\n    /**\n    * Shows a message in the console of the given type.\n    */\n\n    function showError(type, text) {\n      win.console && win.console[type] && win.console[type]('fullPage: ' + text);\n    }\n    function isVisible(el) {\n      var style = win.getComputedStyle(el);\n      return style.display !== 'none';\n    }\n    function getVisible(elements) {\n      return Array.from(elements).filter(function (e) {\n        return isVisible(e);\n      });\n    }\n    /**\n    * Equivalent of jQuery function $().\n    */\n\n    function $(selector, context) {\n      context = arguments.length > 1 ? context : document;\n      return context ? context.querySelectorAll(selector) : null;\n    }\n    /**\n    * Extends a given Object properties and its childs.\n    */\n\n    function deepExtend(out) {\n      out = out || {};\n\n      for (var i = 1, len = arguments.length; i < len; ++i) {\n        var obj = arguments[i];\n\n        if (!obj) {\n          continue;\n        }\n\n        for (var key in obj) {\n          if (!obj.hasOwnProperty(key) || key == '__proto__' || key == 'constructor') {\n            continue;\n          } // based on https://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/\n\n\n          if (Object.prototype.toString.call(obj[key]) === '[object Object]') {\n            out[key] = deepExtend(out[key], obj[key]);\n            continue;\n          }\n\n          out[key] = obj[key];\n        }\n      }\n\n      return out;\n    }\n    /**\n    * Checks if the passed element contains the passed class.\n    */\n\n    function hasClass(el, className) {\n      if (el == null) {\n        return false;\n      }\n\n      return el.classList.contains(className);\n    }\n    /**\n    * Gets the window height. Crossbrowser.\n    */\n\n    function getWindowHeight() {\n      return 'innerHeight' in win ? win.innerHeight : doc.documentElement.offsetHeight;\n    }\n    /**\n    * Gets the window width.\n    */\n\n    function getWindowWidth() {\n      return win.innerWidth;\n    }\n    /**\n    * Set's the CSS properties for the passed item/s.\n    * @param {NodeList|HTMLElement|Object} items\n    * @param {Object} props css properties and values.\n    */\n\n    function css(items, props) {\n      items = getList(items);\n      var key;\n\n      for (key in props) {\n        if (props.hasOwnProperty(key)) {\n          if (key !== null) {\n            for (var i = 0; i < items.length; i++) {\n              var item = items[i];\n              item.style[key] = props[key];\n            }\n          }\n        }\n      }\n\n      return items;\n    }\n    /**\n    * Gets the previous element to the passed element.\n    */\n\n    function prev(item) {\n      return item.previousElementSibling;\n    }\n    /**\n    * Gets the next element to the passed element.\n    */\n\n    function next(item) {\n      return item.nextElementSibling;\n    }\n    /**\n    * Gets the last element from the passed list of elements.\n    */\n\n    function last(item) {\n      return item[item.length - 1];\n    }\n    /**\n    * Gets index from the passed element.\n    * @param {String} selector is optional.\n    */\n\n    function index(item, selector) {\n      item = isArrayOrList(item) ? item[0] : item;\n      var children = selector != null ? $(selector, item.parentNode) : item.parentNode.childNodes;\n      var num = 0;\n\n      for (var i = 0; i < children.length; i++) {\n        if (children[i] == item) return num;\n        if (children[i].nodeType == 1) num++;\n      }\n\n      return -1;\n    }\n    /**\n    * Gets an iterable element for the passed element/s\n    */\n\n    function getList(item) {\n      return !isArrayOrList(item) ? [item] : item;\n    }\n    /**\n    * Adds the display=none property for the passed element/s\n    */\n\n    function hide(el) {\n      el = getList(el);\n\n      for (var i = 0; i < el.length; i++) {\n        el[i].style.display = 'none';\n      }\n\n      return el;\n    }\n    /**\n    * Adds the display=block property for the passed element/s\n    */\n\n    function show(el) {\n      el = getList(el);\n\n      for (var i = 0; i < el.length; i++) {\n        el[i].style.display = 'block';\n      }\n\n      return el;\n    }\n    /**\n    * Checks if the passed element is an iterable element or not\n    */\n\n    function isArrayOrList(el) {\n      return Object.prototype.toString.call(el) === '[object Array]' || Object.prototype.toString.call(el) === '[object NodeList]';\n    }\n    /**\n    * Adds the passed class to the passed element/s\n    */\n\n    function addClass(el, className) {\n      el = getList(el);\n\n      for (var i = 0; i < el.length; i++) {\n        var item = el[i];\n        item.classList.add(className);\n      }\n\n      return el;\n    }\n    /**\n    * Removes the passed class to the passed element/s\n    * @param {String} `className` can be multiple classnames separated by whitespace\n    */\n\n    function removeClass(el, className) {\n      el = getList(el);\n      var classNames = className.split(' ');\n\n      for (var a = 0; a < classNames.length; a++) {\n        className = classNames[a];\n\n        for (var i = 0; i < el.length; i++) {\n          var item = el[i];\n          item.classList.remove(className);\n        }\n      }\n\n      return el;\n    }\n    /**\n    * Appends the given element ot the given parent.\n    */\n\n    function appendTo(el, parent) {\n      parent.appendChild(el);\n    }\n    /**\n    Usage:\n\n    var wrapper = document.createElement('div');\n    wrapper.className = 'fp-slides';\n    wrap($('.slide'), wrapper);\n\n    https://jsfiddle.net/qwzc7oy3/15/ (vanilla)\n    https://jsfiddle.net/oya6ndka/1/ (jquery equivalent)\n    */\n\n    function wrap(toWrap, wrapper, isWrapAll) {\n      var newParent;\n      wrapper = wrapper || doc.createElement('div');\n\n      for (var i = 0; i < toWrap.length; i++) {\n        var item = toWrap[i];\n\n        if (isWrapAll && !i || !isWrapAll) {\n          newParent = wrapper.cloneNode(true);\n          item.parentNode.insertBefore(newParent, item);\n        }\n\n        newParent.appendChild(item);\n      }\n\n      return toWrap;\n    }\n    /**\n    Usage:\n    var wrapper = document.createElement('div');\n    wrapper.className = 'fp-slides';\n    wrap($('.slide'), wrapper);\n\n    https://jsfiddle.net/qwzc7oy3/27/ (vanilla)\n    https://jsfiddle.net/oya6ndka/4/ (jquery equivalent)\n    */\n\n    function wrapAll(toWrap, wrapper) {\n      wrap(toWrap, wrapper, true);\n    }\n    /**\n    * Usage:\n    * wrapInner(document.querySelector('#pepe'), '<div class=\"test\">afdas</div>');\n    * wrapInner(document.querySelector('#pepe'), element);\n    *\n    * https://jsfiddle.net/zexxz0tw/6/\n    *\n    * https://stackoverflow.com/a/21817590/1081396\n    */\n\n    function wrapInner(parent, wrapper) {\n      parent.appendChild(wrapper);\n\n      while (parent.firstChild !== wrapper) {\n        wrapper.appendChild(parent.firstChild);\n      }\n    }\n    /**\n    * Usage:\n    * unwrap(document.querySelector('#pepe'));\n    * unwrap(element);\n    *\n    * https://jsfiddle.net/szjt0hxq/1/\n    *\n    */\n\n    function unwrap(wrapper) {\n      var wrapperContent = doc.createDocumentFragment();\n\n      while (wrapper.firstChild) {\n        wrapperContent.appendChild(wrapper.firstChild);\n      }\n\n      wrapper.parentNode.replaceChild(wrapperContent, wrapper);\n    }\n    /**\n    * http://stackoverflow.com/questions/22100853/dom-pure-javascript-solution-to-jquery-closest-implementation\n    * Returns the element or `false` if there's none\n    */\n\n    function closest(el, selector) {\n      if (el && el.nodeType === 1) {\n        if (matches(el, selector)) {\n          return el;\n        }\n\n        return closest(el.parentNode, selector);\n      }\n\n      return null;\n    }\n    /**\n    * Places one element (rel) after another one or group of them (reference).\n    * @param {HTMLElement} reference\n    * @param {HTMLElement|NodeList|String|Array} el\n    * https://jsfiddle.net/9s97hhzv/1/\n    */\n\n    function after(reference, el) {\n      insertBefore(reference, reference.nextSibling, el);\n    }\n    /**\n    * Places one element (rel) before another one or group of them (reference).\n    * @param {HTMLElement} reference\n    * @param {HTMLElement|NodeList|String|Array} el\n    * https://jsfiddle.net/9s97hhzv/1/\n    */\n\n    function before(reference, el) {\n      insertBefore(reference, reference, el);\n    }\n    /**\n    * Based in https://stackoverflow.com/a/19316024/1081396\n    * and https://stackoverflow.com/a/4793630/1081396\n    */\n\n    function insertBefore(reference, beforeElement, el) {\n      if (!isArrayOrList(el)) {\n        if (typeof el == 'string') {\n          el = createElementFromHTML(el);\n        }\n\n        el = [el];\n      }\n\n      for (var i = 0; i < el.length; i++) {\n        reference.parentNode.insertBefore(el[i], beforeElement);\n      }\n    } //http://stackoverflow.com/questions/3464876/javascript-get-window-x-y-position-for-scroll\n\n    function getScrollTop() {\n      var docElement = doc.documentElement;\n      return (win.pageYOffset || docElement.scrollTop) - (docElement.clientTop || 0);\n    }\n    /**\n    * Gets the siblings of the passed element\n    */\n\n    function siblings(el) {\n      return Array.prototype.filter.call(el.parentNode.children, function (child) {\n        return child !== el;\n      });\n    }\n    function preventDefault(event) {\n      event.preventDefault();\n    }\n    function getAttr(el, attr) {\n      return el.getAttribute(attr);\n    }\n    function docAddEvent(event, callback, options) {\n      doc.addEventListener(event, callback, options === 'undefined' ? null : options);\n    }\n    function windowAddEvent(event, callback, options) {\n      win.addEventListener(event, callback, options === 'undefined' ? null : options);\n    }\n    function docRemoveEvent(event, callback, options) {\n      doc.removeEventListener(event, callback, options === 'undefined' ? null : options);\n    }\n    function windowRemoveEvent(event, callback, options) {\n      win.removeEventListener(event, callback, options === 'undefined' ? null : options);\n    }\n    /**\n    * Determines whether the passed item is of function type.\n    */\n\n    function isFunction(item) {\n      if (typeof item === 'function') {\n        return true;\n      }\n\n      var type = Object.prototype.toString.call(item);\n      return type === '[object Function]' || type === '[object GeneratorFunction]';\n    }\n    /**\n    * Trigger custom events\n    */\n\n    function trigger(el, eventName, data) {\n      var event;\n      data = typeof data === 'undefined' ? {} : data; // Native\n\n      if (typeof win.CustomEvent === \"function\") {\n        event = new CustomEvent(eventName, {\n          detail: data\n        });\n      } else {\n        event = doc.createEvent('CustomEvent');\n        event.initCustomEvent(eventName, true, true, data);\n      }\n\n      el.dispatchEvent(event);\n    }\n    /**\n    * Polyfill of .matches()\n    */\n\n    function matches(el, selector) {\n      return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector);\n    }\n    /**\n    * Toggles the visibility of the passed element el.\n    */\n\n    function toggle(el, value) {\n      if (typeof value === \"boolean\") {\n        for (var i = 0; i < el.length; i++) {\n          el[i].style.display = value ? 'block' : 'none';\n        }\n      } //we don't use it in other way, so no else :)\n\n\n      return el;\n    }\n    /**\n    * Creates a HTMLElement from the passed HTML string.\n    * https://stackoverflow.com/a/494348/1081396\n    */\n\n    function createElementFromHTML(htmlString) {\n      var div = doc.createElement('div');\n      div.innerHTML = htmlString.trim(); // Change this to div.childNodes to support multiple top-level nodes\n\n      return div.firstChild;\n    }\n    /**\n    * Removes the passed item/s from the DOM.\n    */\n\n    function remove(items) {\n      items = getList(items);\n\n      for (var i = 0; i < items.length; i++) {\n        var item = items[i];\n\n        if (item && item.parentElement) {\n          item.parentNode.removeChild(item);\n        }\n      }\n    } //https://jsfiddle.net/w1rktecz/\n\n    function untilAll(item, selector, fn) {\n      var sibling = item[fn];\n      var siblings = [];\n\n      while (sibling) {\n        if (matches(sibling, selector) || selector == null) {\n          siblings.push(sibling);\n        }\n\n        sibling = sibling[fn];\n      }\n\n      return siblings;\n    }\n    /**\n    * Gets all next elements matching the passed selector.\n    */\n\n    function nextAll(item, selector) {\n      return untilAll(item, selector, 'nextElementSibling');\n    }\n    /**\n    * Gets all previous elements matching the passed selector.\n    */\n\n    function prevAll(item, selector) {\n      return untilAll(item, selector, 'previousElementSibling');\n    }\n    /**\n    * Converts an object to an array.\n    */\n\n    function toArray(objectData) {\n      return Object.keys(objectData).map(function (key) {\n        return objectData[key];\n      });\n    }\n    function getLast(items) {\n      return items[items.length - 1];\n    }\n    /**\n    * Gets the average of the last `number` elements of the given array.\n    */\n\n    function getAverage(elements, number) {\n      var sum = 0; //taking `number` elements from the end to make the average, if there are not enought, 1\n\n      var lastElements = elements.slice(Math.max(elements.length - number, 1));\n\n      for (var i = 0; i < lastElements.length; i++) {\n        sum = sum + lastElements[i];\n      }\n\n      return Math.ceil(sum / number);\n    }\n    /**\n    * Sets the value for the given attribute from the `data-` attribute with the same suffix\n    * ie: data-srcset ==> srcset  |  data-src ==> src\n    */\n\n    function setSrc(element, attribute) {\n      element.setAttribute(attribute, getAttr(element, 'data-' + attribute));\n      element.removeAttribute('data-' + attribute);\n    }\n    function getParentsUntil(item, topParentSelector) {\n      var parents = [item];\n\n      do {\n        item = item.parentNode;\n        parents.push(item);\n      } while (!matches(item, topParentSelector));\n\n      return parents;\n    }\n    function isInsideInput() {\n      var activeElement = doc.activeElement;\n      return matches(activeElement, 'textarea') || matches(activeElement, 'input') || matches(activeElement, 'select') || getAttr(activeElement, 'contentEditable') == \"true\" || getAttr(activeElement, 'contentEditable') == '';\n    } //utils are public, so we can use it wherever we want\n    // @ts-ignore\n\n    window[\"fp_utils\"] = {\n      \"$\": $,\n      \"deepExtend\": deepExtend,\n      \"hasClass\": hasClass,\n      \"getWindowHeight\": getWindowHeight,\n      \"css\": css,\n      \"prev\": prev,\n      \"next\": next,\n      \"last\": last,\n      \"index\": index,\n      \"getList\": getList,\n      \"hide\": hide,\n      \"show\": show,\n      \"isArrayOrList\": isArrayOrList,\n      \"addClass\": addClass,\n      \"removeClass\": removeClass,\n      \"appendTo\": appendTo,\n      \"wrap\": wrap,\n      \"wrapAll\": wrapAll,\n      \"unwrap\": unwrap,\n      \"closest\": closest,\n      \"after\": after,\n      \"before\": before,\n      \"insertBefore\": insertBefore,\n      \"getScrollTop\": getScrollTop,\n      \"siblings\": siblings,\n      \"preventDefault\": preventDefault,\n      \"isFunction\": isFunction,\n      \"trigger\": trigger,\n      \"matches\": matches,\n      \"toggle\": toggle,\n      \"createElementFromHTML\": createElementFromHTML,\n      \"remove\": remove,\n      // \"filter\": filter,\n      \"untilAll\": untilAll,\n      \"nextAll\": nextAll,\n      \"prevAll\": prevAll,\n      \"showError\": showError\n    };\n\n    var utils = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        showError: showError,\n        isVisible: isVisible,\n        getVisible: getVisible,\n        $: $,\n        deepExtend: deepExtend,\n        hasClass: hasClass,\n        getWindowHeight: getWindowHeight,\n        getWindowWidth: getWindowWidth,\n        css: css,\n        prev: prev,\n        next: next,\n        last: last,\n        index: index,\n        getList: getList,\n        hide: hide,\n        show: show,\n        isArrayOrList: isArrayOrList,\n        addClass: addClass,\n        removeClass: removeClass,\n        appendTo: appendTo,\n        wrap: wrap,\n        wrapAll: wrapAll,\n        wrapInner: wrapInner,\n        unwrap: unwrap,\n        closest: closest,\n        after: after,\n        before: before,\n        insertBefore: insertBefore,\n        getScrollTop: getScrollTop,\n        siblings: siblings,\n        preventDefault: preventDefault,\n        getAttr: getAttr,\n        docAddEvent: docAddEvent,\n        windowAddEvent: windowAddEvent,\n        docRemoveEvent: docRemoveEvent,\n        windowRemoveEvent: windowRemoveEvent,\n        isFunction: isFunction,\n        trigger: trigger,\n        matches: matches,\n        toggle: toggle,\n        createElementFromHTML: createElementFromHTML,\n        remove: remove,\n        untilAll: untilAll,\n        nextAll: nextAll,\n        prevAll: prevAll,\n        toArray: toArray,\n        getLast: getLast,\n        getAverage: getAverage,\n        setSrc: setSrc,\n        getParentsUntil: getParentsUntil,\n        isInsideInput: isInsideInput\n    });\n\n    function _typeof(obj) {\n      \"@babel/helpers - typeof\";\n\n      if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n        _typeof = function (obj) {\n          return typeof obj;\n        };\n      } else {\n        _typeof = function (obj) {\n          return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n        };\n      }\n\n      return _typeof(obj);\n    }\n\n    var EventEmitter = {\n      events: {},\n      on: function on(event, listener) {\n        var _this = this;\n\n        if (_typeof(this.events[event]) !== 'object') {\n          this.events[event] = [];\n        }\n\n        this.events[event].push(listener);\n        return function () {\n          return _this.removeListener(event, listener);\n        };\n      },\n      removeListener: function removeListener(event, listener) {\n        if (_typeof(this.events[event]) === 'object') {\n          var idx = this.events[event].indexOf(listener);\n\n          if (idx > -1) {\n            this.events[event].splice(idx, 1);\n          }\n        }\n      },\n      emit: function emit(event) {\n        var _this2 = this;\n\n        for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n          args[_key - 1] = arguments[_key];\n        }\n\n        if (_typeof(this.events[event]) === 'object') {\n          this.events[event].forEach(function (listener) {\n            return listener.apply(_this2, args);\n          });\n        }\n      },\n      once: function once(event, listener) {\n        var _this3 = this;\n\n        var remove = this.on(event, function () {\n          remove();\n\n          for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n            args[_key2] = arguments[_key2];\n          }\n\n          listener.apply(_this3, args);\n        });\n      }\n    };\n\n    var state = {\n      numSections: 0,\n      numSlides: 0,\n      slides: [],\n      sections: [],\n      activeSection: null,\n      scrollTrigger: null,\n      isBeyondFullpage: false,\n      aboutToScrollToFullPage: false,\n      slideMoving: false,\n      isResizing: false,\n      isScrolling: false,\n      lastScrolledDestiny: undefined,\n      lastScrolledSlide: undefined,\n      activeAnimation: false,\n      canScroll: true,\n      touchDirection: 'none',\n      wheelDirection: 'none',\n      isGrabbing: false,\n      isUsingWheel: false,\n      isWindowFocused: true,\n      previousDestTop: 0,\n      windowsHeight: getWindowHeight(),\n      isDoingContinousVertical: false,\n      timeouts: {},\n      scrollY: 0,\n      scrollX: 0\n    }; // @ts-ignore\n\n    win.state = state;\n    function setState(props) {\n      Object.assign(state, props);\n    }\n    function getState() {\n      return state;\n    }\n    function getActivePanel() {\n      return state.activeSection && state.activeSection.activeSlide ? state.activeSection.activeSlide : state.activeSection;\n    }\n\n    var events = {\n      onAfterRenderNoAnchor: 'onAfterRenderNoAnchor',\n      onClickOrTouch: 'onClickOrTouch',\n      moveSlideLeft: 'moveSlideLeft',\n      moveSlideRight: 'moveSlideRight',\n      onInitialise: 'onInitialise',\n      beforeInit: 'beforeInit',\n      bindEvents: 'bindEvents',\n      onDestroy: 'onDestroy',\n      contentChanged: 'contentChanged',\n      onScrollOverflowScrolled: 'onScrollOverflowScrolled',\n      onScrollPageAndSlide: 'onScrollPageAndSlide',\n      onKeyDown: 'onKeyDown',\n      onMenuClick: 'onMenuClick',\n      scrollPage: 'scrollPage',\n      landscapeScroll: 'landscapeScroll',\n      scrollBeyondFullpage: 'scrollBeyondFullpage',\n      onPerformMovement: 'onPerformMovement',\n      onSlideLeave: 'onSlideLeave',\n      onLeave: 'onLeave',\n      afterSectionLoads: 'afterSectionLoads',\n      afterSlideLoads: 'afterSlideLoads'\n    };\n\n    EventEmitter.on(events.bindEvents, bindEvents$c);\n\n    function bindEvents$c() {\n      //Scrolls to the section when clicking the navigation bullet\n      //simulating the jQuery .on('click') event using delegation\n      ['click', 'touchstart'].forEach(function (eventName) {\n        docAddEvent(eventName, delegatedEvents);\n      });\n      windowAddEvent('focus', focusHandler);\n      internalEvents();\n    }\n\n    function internalEvents() {\n      EventEmitter.on(events.onDestroy, onDestroy$9);\n    }\n\n    function delegatedEvents(e) {\n      EventEmitter.emit(events.onClickOrTouch, {\n        e: e,\n        target: e.target\n      });\n    }\n\n    function onDestroy$9() {\n      ['click', 'touchstart'].forEach(function (eventName) {\n        docRemoveEvent(eventName, delegatedEvents);\n      });\n    } // changing isWindowFocused to true on focus event\n\n\n    function focusHandler() {\n      setState({\n        isWindowFocused: true\n      });\n    }\n\n    // keeping central set of classnames and selectors\n    var WRAPPER = 'fullpage-wrapper';\n    var WRAPPER_SEL = '.' + WRAPPER; // slimscroll\n\n    var SCROLLABLE = 'fp-scrollable';\n\n    var RESPONSIVE = 'fp-responsive';\n    var NO_TRANSITION = 'fp-notransition';\n    var DESTROYED = 'fp-destroyed';\n    var ENABLED = 'fp-enabled';\n    var VIEWING_PREFIX = 'fp-viewing';\n    var ACTIVE = 'active';\n    var ACTIVE_SEL = '.' + ACTIVE;\n    var COMPLETELY = 'fp-completely';\n    var COMPLETELY_SEL = '.' + COMPLETELY; // section\n\n    var SECTION_DEFAULT_SEL = '.section';\n    var SECTION = 'fp-section';\n    var SECTION_SEL = '.' + SECTION;\n    var SECTION_ACTIVE_SEL = SECTION_SEL + ACTIVE_SEL;\n    var TABLE_CELL = 'fp-tableCell';\n    var TABLE_CELL_SEL = '.' + TABLE_CELL;\n    var AUTO_HEIGHT = 'fp-auto-height';\n    var AUTO_HEIGHT_SEL = '.' + AUTO_HEIGHT;\n    var AUTO_HEIGHT_RESPONSIVE = 'fp-auto-height-responsive';\n    var AUTO_HEIGHT_RESPONSIVE_SEL = '.' + AUTO_HEIGHT_RESPONSIVE;\n    var NORMAL_SCROLL = 'fp-normal-scroll';\n\n    var SECTION_NAV = 'fp-nav';\n    var SECTION_NAV_SEL = '#' + SECTION_NAV;\n    var SECTION_NAV_TOOLTIP = 'fp-tooltip';\n    var SECTION_NAV_TOOLTIP_SEL = '.' + SECTION_NAV_TOOLTIP;\n    var SHOW_ACTIVE_TOOLTIP = 'fp-show-active'; // slide\n\n    var SLIDE_DEFAULT_SEL = '.slide';\n    var SLIDE = 'fp-slide';\n    var SLIDE_SEL = '.' + SLIDE;\n    var SLIDE_ACTIVE_SEL = SLIDE_SEL + ACTIVE_SEL;\n    var SLIDES_WRAPPER = 'fp-slides';\n    var SLIDES_WRAPPER_SEL = '.' + SLIDES_WRAPPER;\n    var SLIDES_CONTAINER = 'fp-slidesContainer';\n    var SLIDES_CONTAINER_SEL = '.' + SLIDES_CONTAINER;\n    var TABLE = 'fp-table';\n    var OVERFLOW = 'fp-overflow';\n    var OVERFLOW_SEL = '.' + OVERFLOW;\n    var IS_OVERFLOW = 'fp-is-overflow'; // slide nav\n\n    var SLIDES_NAV = 'fp-slidesNav';\n    var SLIDES_NAV_SEL = '.' + SLIDES_NAV;\n    var SLIDES_NAV_LINK_SEL = SLIDES_NAV_SEL + ' a';\n    var SLIDES_STYLED_ARROW = 'fp-arrow';\n    var SLIDES_ARROW = 'fp-controlArrow';\n    var SLIDES_ARROW_SEL = '.' + SLIDES_ARROW;\n    var SLIDES_PREV = 'fp-prev';\n    var SLIDES_PREV_SEL = '.' + SLIDES_PREV;\n    var SLIDES_ARROW_PREV_SEL = SLIDES_ARROW_SEL + SLIDES_PREV_SEL;\n    var SLIDES_NEXT = 'fp-next';\n    var SLIDES_NEXT_SEL = '.' + SLIDES_NEXT;\n    var SLIDES_ARROW_NEXT_SEL = SLIDES_ARROW_SEL + SLIDES_NEXT_SEL;\n\n    var defaultOptions = {\n      //navigation\n      menu: false,\n      anchors: [],\n      lockAnchors: false,\n      navigation: false,\n      navigationPosition: 'right',\n      navigationTooltips: [],\n      showActiveTooltip: false,\n      slidesNavigation: false,\n      slidesNavPosition: 'bottom',\n      scrollBar: false,\n      hybrid: false,\n      licenseKey: '',\n      credits: {\n        \"enabled\": true,\n        \"label\": 'Made with fullPage.js',\n        \"position\": 'right'\n      },\n      //scrolling\n      css3: true,\n      scrollingSpeed: 700,\n      autoScrolling: true,\n      fitToSection: true,\n      fitToSectionDelay: 600,\n      easing: 'easeInOutCubic',\n      easingcss3: 'ease',\n      loopBottom: false,\n      loopTop: false,\n      loopHorizontal: true,\n      continuousVertical: false,\n      continuousHorizontal: false,\n      scrollHorizontally: false,\n      interlockedSlides: false,\n      dragAndMove: false,\n      offsetSections: false,\n      resetSliders: false,\n      fadingEffect: false,\n      normalScrollElements: null,\n      scrollOverflow: true,\n      scrollOverflowReset: false,\n      touchSensitivity: 5,\n      touchWrapper: null,\n      bigSectionsDestination: null,\n      //Accessibility\n      keyboardScrolling: true,\n      animateAnchor: true,\n      recordHistory: true,\n      allowCorrectDirection: false,\n      //design\n      scrollOverflowMacStyle: true,\n      controlArrows: true,\n      controlArrowsHTML: ['<div class=\"' + SLIDES_STYLED_ARROW + '\"></div>', '<div class=\"' + SLIDES_STYLED_ARROW + '\"></div>'],\n      controlArrowColor: '#fff',\n      verticalCentered: true,\n      sectionsColor: [],\n      paddingTop: 0,\n      paddingBottom: 0,\n      fixedElements: null,\n      responsive: 0,\n      //backwards compabitility with responsiveWiddth\n      responsiveWidth: 0,\n      responsiveHeight: 0,\n      responsiveSlides: false,\n      parallax: false,\n      parallaxOptions: {\n        type: 'reveal',\n        percentage: 62,\n        property: 'translate'\n      },\n      cards: false,\n      cardsOptions: {\n        perspective: 100,\n        fadeContent: true,\n        fadeBackground: true\n      },\n      //Custom selectors\n      sectionSelector: SECTION_DEFAULT_SEL,\n      slideSelector: SLIDE_DEFAULT_SEL,\n      //events\n      afterLoad: null,\n      beforeLeave: null,\n      onLeave: null,\n      afterRender: null,\n      afterResize: null,\n      afterReBuild: null,\n      afterSlideLoad: null,\n      onSlideLeave: null,\n      afterResponsive: null,\n      onScrollOverflow: null,\n      lazyLoading: true,\n      observer: true,\n      scrollBeyondFullpage: true\n    };\n\n    var container = null;\n    var g_initialAnchorsInDom = false;\n    var originals = deepExtend({}, defaultOptions); //deep copy\n\n    var g_options = null;\n    function getInitialAnchorsInDom() {\n      return g_initialAnchorsInDom;\n    }\n    function setContainer(value) {\n      container = value;\n    }\n    function getContainer(value) {\n      return container;\n    }\n    function getOptions() {\n      return g_options || defaultOptions;\n    }\n    function setOptions(options) {\n      g_options = deepExtend({}, defaultOptions, options);\n      originals = Object.assign({}, g_options);\n    }\n    function getOriginals() {\n      return originals;\n    }\n    function setOption(name, value) {\n      defaultOptions[name] = value;\n    }\n    /*\n    * Sets the state for a variable with multiple states (original, and temporal)\n    * Some variables such as `autoScrolling` or `recordHistory` might change automatically its state when using `responsive` or `autoScrolling:false`.\n    * This function is used to keep track of both states, the original and the temporal one.\n    * If type is not 'internal', then we assume the user is globally changing the variable.\n    */\n\n    function setVariableState(variable, value, type) {\n      g_options[variable] = value;\n\n      if (type !== 'internal') {\n        originals[variable] = value;\n      }\n    }\n    /**\n    * Setting options from DOM elements if they are not provided.\n    */\n\n    function setOptionsFromDOM() {\n      //no anchors option? Checking for them in the DOM attributes\n      if (!getOptions().anchors.length) {\n        var anchorsAttribute = '[data-anchor]';\n        var anchors = $(getOptions().sectionSelector.split(',').join(anchorsAttribute + ',') + anchorsAttribute, container);\n\n        if (anchors.length && anchors.length === $(getOptions().sectionSelector, container).length) {\n          g_initialAnchorsInDom = true;\n          anchors.forEach(function (item) {\n            getOptions().anchors.push(getAttr(item, 'data-anchor').toString());\n          });\n        }\n      } //no tooltips option? Checking for them in the DOM attributes\n\n\n      if (!getOptions().navigationTooltips.length) {\n        var tooltipsAttribute = '[data-tooltip]';\n        var tooltips = $(getOptions().sectionSelector.split(',').join(tooltipsAttribute + ',') + tooltipsAttribute, container);\n\n        if (tooltips.length) {\n          tooltips.forEach(function (item) {\n            getOptions().navigationTooltips.push(getAttr(item, 'data-tooltip').toString());\n          });\n        }\n      }\n    }\n\n    var plainItem = function plainItem(panel) {\n      this.anchor = panel.anchor;\n      this.item = panel.item;\n      this.index = panel.index();\n      this.isLast = this.index === panel.item.parentElement.querySelectorAll(panel.selector).length - 1;\n      this.isFirst = !this.index;\n      this.isActive = panel.isActive;\n    };\n    /**\n    * Item. Slide or Section objects share the same properties.\n    */\n\n    var Item = function Item(el, selector) {\n      this.parent = this.parent || null;\n      this.selector = selector;\n      this.anchor = getAttr(el, 'data-anchor') || getOptions().anchors[index(el, getOptions().sectionSelector)];\n      this.item = el;\n      this.isVisible = isVisible(el);\n      this.isActive = hasClass(el, ACTIVE);\n      this.hasScroll = hasClass(el, OVERFLOW) || $(OVERFLOW_SEL, el)[0] != null;\n      this.isSection = selector === getOptions().sectionSelector;\n      this.container = closest(el, SLIDES_CONTAINER_SEL) || closest(el, WRAPPER_SEL);\n\n      this.index = function () {\n        return this.siblings().indexOf(this);\n      };\n    };\n\n    Item.prototype.siblings = function () {\n      if (this.isSection) {\n        if (this.isVisible) {\n          return state.sections;\n        } else {\n          return state.sectionsIncludingHidden;\n        }\n      }\n\n      return this.parent ? this.parent.slides : 0;\n    };\n\n    Item.prototype.prev = function () {\n      var siblings = this.siblings();\n      var currentIndex = this.isSection ? siblings.indexOf(this) : this.parent.slides.indexOf(this);\n      var prevIndex = currentIndex - 1;\n\n      if (prevIndex >= 0) {\n        return siblings[prevIndex];\n      }\n\n      return null;\n    };\n\n    Item.prototype.next = function () {\n      var siblings = this.siblings();\n      var currentIndex = this.isSection ? siblings.indexOf(this) : this.parent.slides.indexOf(this);\n      var nextIndex = currentIndex + 1;\n\n      if (nextIndex < siblings.length) {\n        return siblings[nextIndex];\n      }\n\n      return null;\n    };\n\n    Item.prototype[\"prevPanel\"] = function () {\n      return this.prev() || (this.parent ? this.parent.prev() : null);\n    };\n\n    Item.prototype[\"nextPanel\"] = function () {\n      return this.next() || (this.parent ? this.parent.next() : null);\n    };\n\n    Item.prototype.getSiblings = function () {\n      if (this.isSection) {\n        return state.sections;\n      }\n\n      return state.panels;\n    };\n\n    function getNodes(panels) {\n      return panels.map(function (panel) {\n        return panel.item;\n      });\n    }\n    function getPanelByElement(panels, el) {\n      return panels.find(function (panel) {\n        return panel.item === el;\n      });\n    }\n    var Section = function Section(el) {\n      plainItem.call(this, el);\n    };\n    var Slide = function Slide(el) {\n      plainItem.call(this, el);\n    };\n\n    /**\n    * Gets the active slide (or section) for the given section\n    */\n\n    function getSlideOrSection(destiny) {\n      var slide = $(SLIDE_ACTIVE_SEL, destiny);\n\n      if (slide.length) {\n        destiny = slide[0];\n      }\n\n      return destiny;\n    }\n    function getSlideOrSectionPanel(panel) {\n      if (!panel) {\n        return null;\n      }\n\n      return panel.activeSlide ? panel.activeSlide : panel;\n    }\n    function isFullPageAbove() {\n      return getContainer().getBoundingClientRect().bottom >= 0;\n    }\n    /**\n    * Gets the scrolling settings depending on the plugin autoScrolling option\n    */\n\n    function getScrollSettings(top) {\n      var options = getOptions();\n      var position;\n      var element; //top property animation\n\n      if (options.autoScrolling && !options.scrollBar) {\n        position = -top;\n        element = $(WRAPPER_SEL)[0];\n      } //window real scrolling\n      else {\n        position = top;\n        element = window;\n      }\n\n      return {\n        options: position,\n        element: element\n      };\n    }\n    /**\n    * Scrolls the page / slider the given number of pixels.\n    * It will do it one or another way dependiong on the library's config.\n    */\n\n    function setScrolling(element, val) {\n      if (!getOptions().autoScrolling || getOptions().scrollBar || element.self != window && hasClass(element, SLIDES_WRAPPER)) {\n        //scrolling horizontally through the slides?\n        if (element.self != window && hasClass(element, SLIDES_WRAPPER)) {\n          element.scrollLeft = val;\n        } //vertical scroll\n        else {\n          element.scrollTo(0, val);\n        }\n      } else {\n        element.style.top = val + 'px';\n      }\n    }\n    /**\n    * Adds transition animations for the given element\n    */\n\n    function addAnimation(element) {\n      var transition = 'transform ' + getOptions().scrollingSpeed + 'ms ' + getOptions().easingcss3;\n      removeClass(element, NO_TRANSITION);\n      return css(element, {\n        '-webkit-transition': transition,\n        'transition': transition\n      });\n    }\n    /**\n    * Retuns `up` or `down` depending on the scrolling movement to reach its destination\n    * from the current section.\n    */\n\n    function getYmovement(activeSection, destiny) {\n      var fromIndex = activeSection.index();\n      var toIndex = index(destiny, SECTION_SEL);\n\n      if (fromIndex == toIndex) {\n        return 'none';\n      }\n\n      if (fromIndex > toIndex) {\n        return 'up';\n      }\n\n      return 'down';\n    }\n    /**\n    * Remove transition animations for the given element\n    */\n\n    function removeAnimation(element) {\n      return addClass(element, NO_TRANSITION);\n    }\n    /**\n    * Returns the cross-browser transform string.\n    */\n\n    function getTransforms(translate3d) {\n      return {\n        '-webkit-transform': translate3d,\n        '-moz-transform': translate3d,\n        '-ms-transform': translate3d,\n        'transform': translate3d\n      };\n    }\n\n    var silentScrollId;\n    /**\n    * Adds a css3 transform property to the container class with or without animation depending on the animated param.\n    */\n\n    function transformContainer(translate3d, animated) {\n      if (animated) {\n        addAnimation(getContainer());\n      } else {\n        removeAnimation(getContainer());\n      }\n\n      clearTimeout(silentScrollId);\n      css(getContainer(), getTransforms(translate3d));\n      FP.test.translate3d = translate3d; //syncronously removing the class after the animation has been applied.\n\n      silentScrollId = setTimeout(function () {\n        removeClass(getContainer(), NO_TRANSITION);\n      }, 10);\n    }\n\n    /**\n    * Scrolls silently (with no animation) the page to the given Y position.\n    */\n\n    function silentScroll(top) {\n      // The first section can have a negative value in iOS 10. Not quite sure why: -0.0142822265625\n      // that's why we round it to 0.\n      var roundedTop = Math.round(top);\n\n      if (getOptions().css3 && getOptions().autoScrolling && !getOptions().scrollBar) {\n        var translate3d = 'translate3d(0px, -' + roundedTop + 'px, 0px)';\n        transformContainer(translate3d, false);\n      } else if (getOptions().autoScrolling && !getOptions().scrollBar) {\n        css(getContainer(), {\n          'top': -roundedTop + 'px'\n        });\n        FP.test.top = -roundedTop + 'px';\n      } else {\n        var scrollSettings = getScrollSettings(roundedTop);\n        setScrolling(scrollSettings.element, scrollSettings.options);\n      }\n    }\n\n    FP.setScrollingSpeed = setScrollingSpeed;\n    /**\n    * Defines the scrolling speed\n    */\n\n    function setScrollingSpeed(value, type) {\n      setVariableState('scrollingSpeed', value, type);\n    }\n\n    var $body = null;\n    var $html = null;\n    var $htmlBody = null; // caching common elements\n\n    function setCache() {\n      $body = $('body')[0];\n      $html = $('html')[0];\n      $htmlBody = $('html, body');\n    }\n\n    //@ts-check\n\n    var _g_animateScroll;\n    /**\n    * Simulates the animated scrollTop of jQuery. Used when css3:false or scrollBar:true or autoScrolling:false\n    * http://stackoverflow.com/a/16136789/1081396\n    */\n\n\n    function scrollTo(element, to, duration, callback) {\n      var start = getScrolledPosition(element);\n      var change = to - start;\n      var isCallbackFired = false;\n      var startTime;\n      var wasAnimationActive = state.activeAnimation;\n      setState({\n        activeAnimation: true\n      }); // Cancelling any possible previous animations (io: clicking on nav dots very fast)\n\n      if (_g_animateScroll) {\n        window.cancelAnimationFrame(_g_animateScroll);\n      }\n\n      _g_animateScroll = function g_animateScroll(timestamp) {\n        if (!startTime) {\n          startTime = timestamp;\n        }\n\n        var currentTime = Math.floor(timestamp - startTime);\n\n        if (state.activeAnimation) {\n          //in order to stope it from other function whenever we want\n          var val = to;\n\n          if (duration) {\n            // @ts-ignore\n            val = win.fp_easings[getOptions().easing](currentTime, start, change, duration);\n          }\n\n          if (currentTime <= duration) {\n            setScrolling(element, val);\n          }\n\n          if (currentTime < duration) {\n            window.requestAnimationFrame(_g_animateScroll);\n          } else if (typeof callback !== 'undefined' && !isCallbackFired) {\n            callback();\n            setState({\n              activeAnimation: false\n            });\n            isCallbackFired = true;\n          }\n        } else if (!isCallbackFired && !wasAnimationActive) {\n          callback();\n          setState({\n            activeAnimation: false\n          });\n          isCallbackFired = true;\n        }\n      };\n\n      window.requestAnimationFrame(_g_animateScroll);\n    }\n    /**\n    * Getting the position of the element to scroll when using jQuery animations\n    */\n\n    function getScrolledPosition(element) {\n      var position; //is not the window element and is a slide?\n\n      if (element.self != win && hasClass(element, SLIDES_WRAPPER)) {\n        position = element.scrollLeft;\n      } else if (!getOptions().autoScrolling || getOptions().scrollBar) {\n        position = getScrollTop();\n      } else {\n        position = element.offsetTop;\n      } //gets the top property of the wrapper\n\n\n      return position;\n    }\n\n    /**\n    * Makes sure to only create a Panel object if the element exist\n    */\n\n    function nullOrSection(el) {\n      if (el && !el.item) {\n        return new Section(new SectionPanel(el));\n      }\n\n      return el ? new Section(el) : null;\n    }\n\n    function nullOrSlide(el) {\n      return el ? new Slide(el) : null;\n    }\n\n    /**\n    * Dispatch events & callbacks\n    */\n\n    function fireCallback(eventName, v) {\n      var eventData = getEventData(eventName, v);\n      trigger(getContainer(), eventName, eventData);\n\n      if (getOptions()[eventName].apply(eventData[Object.keys(eventData)[0]], toArray(eventData)) === false) {\n        return false;\n      }\n\n      return true;\n    }\n    /**\n    * Gets the event's data for the given event on the right format.\n    */\n\n    function getEventData(eventName, v) {\n      //using functions to run only the necessary bits within the object\n      var paramsPerEvent = {\n        afterRender: function afterRender() {\n          return {\n            section: nullOrSection(getState().activeSection),\n            slide: nullOrSlide(getState().activeSection.activeSlide)\n          };\n        },\n        onLeave: function onLeave() {\n          return {\n            origin: nullOrSection(v.items.origin),\n            destination: nullOrSection(v.items.destination),\n            direction: v.direction,\n            trigger: getState().scrollTrigger\n          };\n        },\n        afterLoad: function afterLoad() {\n          return paramsPerEvent.onLeave();\n        },\n        afterSlideLoad: function afterSlideLoad() {\n          return {\n            section: nullOrSection(v.items.section),\n            origin: nullOrSection(v.items.origin),\n            destination: nullOrSection(v.items.destination),\n            direction: v.direction,\n            trigger: getState().scrollTrigger\n          };\n        },\n        onSlideLeave: function onSlideLeave() {\n          return paramsPerEvent.afterSlideLoad();\n        },\n        beforeLeave: function beforeLeave() {\n          return paramsPerEvent.onLeave();\n        },\n        onScrollOverflow: function onScrollOverflow() {\n          return {\n            section: nullOrSection(getState().activeSection),\n            slide: nullOrSlide(getState().activeSection.activeSlide),\n            position: v.position,\n            direction: v.direction\n          };\n        }\n      };\n      return paramsPerEvent[eventName]();\n    }\n\n    /**\n    * Plays video and audio elements.\n    */\n\n    function playMedia(destiny) {\n      var panel = getSlideOrSection(destiny); //playing HTML5 media elements\n\n      $('video, audio', panel).forEach(function (element) {\n        if (element.hasAttribute('data-autoplay') && typeof element.play === 'function') {\n          element.play();\n        }\n      }); //youtube videos\n\n      $('iframe[src*=\"youtube.com/embed/\"]', panel).forEach(function (element) {\n        if (element.hasAttribute('data-autoplay')) {\n          playYoutube(element);\n        } //in case the URL was not loaded yet. On page load we need time for the new URL (with the API string) to load.\n\n\n        element.onload = function () {\n          if (element.hasAttribute('data-autoplay')) {\n            playYoutube(element);\n          }\n        };\n      });\n    }\n    /**\n    * Plays a youtube video\n    */\n\n    function playYoutube(element) {\n      element.contentWindow.postMessage('{\"event\":\"command\",\"func\":\"playVideo\",\"args\":\"\"}', '*');\n    }\n    /**\n    * Stops video and audio elements.\n    */\n\n\n    function stopMedia(destiny) {\n      var panel = getSlideOrSection(destiny); //stopping HTML5 media elements\n\n      $('video, audio', panel).forEach(function (element) {\n        if (!element.hasAttribute('data-keepplaying') && typeof element.pause === 'function') {\n          element.pause();\n        }\n      }); //youtube videos\n\n      $('iframe[src*=\"youtube.com/embed/\"]', panel).forEach(function (element) {\n        if (/youtube\\.com\\/embed\\//.test(getAttr(element, 'src')) && !element.hasAttribute('data-keepplaying')) {\n          element.contentWindow.postMessage('{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*');\n        }\n      });\n    }\n    /*\n    * Enables the Youtube videos API so we can control their flow if necessary.\n    */\n\n    function enableYoutubeAPI() {\n      $('iframe[src*=\"youtube.com/embed/\"]', getContainer()).forEach(function (item) {\n        addURLParam(item, 'enablejsapi=1');\n      });\n    }\n    /**\n    * Adds a new parameter and its value to the `src` of a given element\n    */\n\n    function addURLParam(element, newParam) {\n      var originalSrc = getAttr(element, 'src');\n      element.setAttribute('src', originalSrc + getUrlParamSign(originalSrc) + newParam);\n    }\n    /*\n    * Returns the prefix sign to use for a new parameter in an existen URL.\n    *\n    * @return {String}  ? | &\n    */\n\n\n    function getUrlParamSign(url) {\n      return !/\\?/.test(url) ? '?' : '&';\n    }\n\n    /**\n    * Lazy loads image, video and audio elements.\n    */\n\n    function lazyLoad(destiny) {\n      if (!getOptions().lazyLoading) {\n        return;\n      }\n\n      var panel = getSlideOrSection(destiny);\n      $('img[data-src], img[data-srcset], source[data-src], source[data-srcset], video[data-src], audio[data-src], iframe[data-src]', panel).forEach(function (element) {\n        ['src', 'srcset'].forEach(function (type) {\n          var attribute = getAttr(element, 'data-' + type);\n\n          if (attribute != null && attribute) {\n            setSrc(element, type);\n            element.addEventListener('load', function () {\n            });\n          }\n        });\n\n        if (matches(element, 'source')) {\n          var elementToPlay = closest(element, 'video, audio');\n\n          if (elementToPlay) {\n            elementToPlay.load();\n\n            elementToPlay.onloadeddata = function () {\n            };\n          }\n        }\n      });\n    }\n\n    /**\n    * Sets a class for the body of the page depending on the active section / slide\n    */\n\n    function setBodyClass() {\n      var section = getState().activeSection.item;\n      var slide = getState().activeSection.activeSlide;\n      var sectionAnchor = getAnchor(section);\n      var text = String(sectionAnchor);\n\n      if (slide) {\n        var slideAnchor = getAnchor(slide.item);\n        text = text + '-' + slideAnchor;\n      } //changing slash for dash to make it a valid CSS style\n\n\n      text = text.replace('/', '-').replace('#', ''); //removing previous anchor classes\n\n      var classRe = new RegExp('\\\\b\\\\s?' + VIEWING_PREFIX + '-[^\\\\s]+\\\\b', \"g\");\n      $body.className = $body.className.replace(classRe, ''); //adding the current anchor\n\n      addClass($body, VIEWING_PREFIX + '-' + text);\n    }\n    /**\n    * Gets the anchor for the given slide / section. Its index will be used if there's none.\n    */\n\n    function getAnchor(element) {\n      if (!element) {\n        return null;\n      }\n\n      var anchor = getAttr(element, 'data-anchor');\n      var elementIndex = index(element); //Slide without anchor link? We take the index instead.\n\n      if (anchor == null) {\n        anchor = elementIndex;\n      }\n\n      return anchor;\n    }\n\n    /**\n    * Sets the state of the website depending on the active section/slide.\n    * It changes the URL hash when needed and updates the body class.\n    */\n\n    function setPageStatus(slideIndex, slideAnchor, anchorLink) {\n      var sectionHash = '';\n\n      if (getOptions().anchors.length && !getOptions().lockAnchors) {\n        //isn't it the first slide?\n        if (slideIndex) {\n          if (anchorLink != null) {\n            sectionHash = anchorLink;\n          } //slide without anchor link? We take the index instead.\n\n\n          if (slideAnchor == null) {\n            slideAnchor = slideIndex;\n          }\n\n          setState({\n            lastScrolledSlide: slideAnchor\n          });\n          setUrlHash(sectionHash + '/' + slideAnchor); //first slide won't have slide anchor, just the section one\n        } else if (slideIndex != null) {\n          setState({\n            lastScrolledSlide: slideAnchor\n          });\n          setUrlHash(anchorLink);\n        } //section without slides\n        else {\n          setUrlHash(anchorLink);\n        }\n      }\n\n      setBodyClass();\n    }\n    /**\n    * Sets the URL hash.\n    */\n\n    function setUrlHash(url) {\n      if (getOptions().recordHistory) {\n        location.hash = url;\n      } else {\n        //Mobile Chrome doesn't work the normal way, so... lets use HTML5 for phones :)\n        if (isTouchDevice || isTouch) {\n          win.history.replaceState(undefined, undefined, '#' + url);\n        } else {\n          var baseUrl = win.location.href.split('#')[0];\n          win.location.replace(baseUrl + '#' + url);\n        }\n      }\n    }\n\n    /**\n    * Gets the name for screen readers for a section/slide navigation bullet.\n    */\n\n    function getBulletLinkName(i, defaultName, item) {\n      var anchor = defaultName === 'Section' ? getOptions().anchors[i] : getAttr(item, 'data-anchor');\n      return encodeURI(getOptions().navigationTooltips[i] || anchor || defaultName + ' ' + (i + 1));\n    }\n\n    function slideBulletHandler(e) {\n      // not all events are cancellable \n      // https://www.uriports.com/blog/easy-fix-for-intervention-ignored-attempt-to-cancel-a-touchmove-event-with-cancelable-false/\n      if (e.cancelable) {\n        preventDefault(e);\n      }\n\n      setState({\n        scrollTrigger: 'horizontalNav'\n      });\n      /*jshint validthis:true */\n\n      var sectionElem = closest(this, SECTION_SEL);\n      var slides = $(SLIDES_WRAPPER_SEL, closest(this, SECTION_SEL))[0];\n      var section = getPanelByElement(getState().sections, sectionElem);\n      var destiny = section.slides[index(closest(this, 'li'))];\n      EventEmitter.emit(events.landscapeScroll, {\n        slides: slides,\n        destination: destiny.item\n      });\n    }\n    /**\n    * Sets the state for the horizontal bullet navigations.\n    */\n\n    function activeSlidesNavigation(slidesNav, slideIndex) {\n      if (getOptions().slidesNavigation && slidesNav != null) {\n        removeClass($(ACTIVE_SEL, slidesNav), ACTIVE);\n        addClass($('a', $('li', slidesNav)[slideIndex]), ACTIVE);\n      }\n    }\n    /**\n    * Creates a landscape navigation bar with dots for horizontal sliders.\n    */\n\n    function addSlidesNavigation(section) {\n      var sectionElem = section.item;\n      var numSlides = section.slides.length;\n      appendTo(createElementFromHTML('<div class=\"' + SLIDES_NAV + '\"><ul></ul></div>'), sectionElem);\n      var nav = $(SLIDES_NAV_SEL, sectionElem)[0]; //top or bottom\n\n      addClass(nav, 'fp-' + getOptions().slidesNavPosition);\n\n      for (var i = 0; i < numSlides; i++) {\n        var slide = $(SLIDE_SEL, sectionElem)[i];\n        appendTo(createElementFromHTML('<li><a href=\"#\"><span class=\"fp-sr-only\">' + getBulletLinkName(i, 'Slide', slide) + '</span><span></span></a></li>'), $('ul', nav)[0]);\n      } //centering it\n\n\n      css(nav, {\n        'margin-left': '-' + nav.innerWidth / 2 + 'px'\n      });\n      var activeSlideIndex = section.activeSlide ? section.activeSlide.index() : 0;\n      addClass($('a', $('li', nav)[activeSlideIndex]), ACTIVE);\n    }\n\n    var isScrollAllowed = {};\n    isScrollAllowed.m = {\n      'up': true,\n      'down': true,\n      'left': true,\n      'right': true\n    };\n    isScrollAllowed.k = deepExtend({}, isScrollAllowed.m);\n    /**\n    * Allowing or disallowing the mouse/swipe scroll in a given direction. (not for keyboard)\n    * @param type m (mouse) or k (keyboard)\n    */\n\n    function setIsScrollAllowed(value, direction, type) {\n      //up, down, left, right\n      if (direction !== 'all') {\n        isScrollAllowed[type][direction] = value;\n      } //all directions?\n      else {\n        Object.keys(isScrollAllowed[type]).forEach(function (key) {\n          isScrollAllowed[type][key] = value;\n        });\n      }\n    }\n    function getIsScrollAllowed() {\n      return isScrollAllowed;\n    }\n\n    EventEmitter.on(events.onClickOrTouch, onClickOrTouch$2);\n\n    function onClickOrTouch$2(params) {\n      var target = params.target;\n\n      if (matches(target, SLIDES_ARROW_SEL) || closest(target, SLIDES_ARROW_SEL)) {\n        slideArrowHandler.call(target, params);\n      }\n    } //Scrolling horizontally when clicking on the slider controls.\n\n\n    function slideArrowHandler() {\n      /*jshint validthis:true */\n      var section = closest(this, SECTION_SEL);\n      /*jshint validthis:true */\n\n      if (hasClass(this, SLIDES_PREV)) {\n        if (getIsScrollAllowed().m.left) {\n          setState({\n            scrollTrigger: 'slideArrow'\n          });\n          EventEmitter.emit(events.moveSlideLeft, {\n            section: section\n          });\n        }\n      } else {\n        if (getIsScrollAllowed().m.right) {\n          setState({\n            scrollTrigger: 'slideArrow'\n          });\n          EventEmitter.emit(events.moveSlideRight, {\n            section: section\n          });\n        }\n      }\n    }\n    /**\n    * Creates the control arrows for the given section\n    */\n\n\n    function createSlideArrows(section) {\n      var sectionElem = section.item;\n      var arrows = [createElementFromHTML(getOptions().controlArrowsHTML[0]), createElementFromHTML(getOptions().controlArrowsHTML[1])];\n      after($(SLIDES_WRAPPER_SEL, sectionElem)[0], arrows);\n      addClass(arrows, SLIDES_ARROW);\n      addClass(arrows[0], SLIDES_PREV);\n      addClass(arrows[1], SLIDES_NEXT);\n\n      if (getOptions().controlArrowColor !== '#fff') {\n        css($(SLIDES_ARROW_NEXT_SEL, sectionElem), {\n          'border-color': 'transparent transparent transparent ' + getOptions().controlArrowColor\n        });\n        css($(SLIDES_ARROW_PREV_SEL, sectionElem), {\n          'border-color': 'transparent ' + getOptions().controlArrowColor + ' transparent transparent'\n        });\n      }\n\n      if (!getOptions().loopHorizontal) {\n        hide($(SLIDES_ARROW_PREV_SEL, sectionElem));\n      }\n    }\n    function toggleControlArrows(v) {\n      if (!getOptions().loopHorizontal && getOptions().controlArrows) {\n        //hidding it for the fist slide, showing for the rest\n        toggle($(SLIDES_ARROW_PREV_SEL, v.section), v.slideIndex !== 0); //hidding it for the last slide, showing for the rest\n\n        toggle($(SLIDES_ARROW_NEXT_SEL, v.section), next(v.destiny) != null);\n      }\n    }\n\n    FP.setRecordHistory = setRecordHistory;\n    /**\n    * Defines wheter to record the history for each hash change in the URL.\n    */\n\n    function setRecordHistory(value, type) {\n      setVariableState('recordHistory', value, type);\n    }\n\n    FP.setAutoScrolling = setAutoScrolling;\n    FP.test.setAutoScrolling = setAutoScrolling;\n    /**\n    * Sets the autoScroll option.\n    * It changes the scroll bar visibility and the history of the site as a result.\n    */\n\n    function setAutoScrolling(value, type) {\n      //removing the transformation\n      if (!value) {\n        silentScroll(0);\n      }\n\n      setVariableState('autoScrolling', value, type);\n      var element = getState().activeSection.item;\n\n      if (getOptions().autoScrolling && !getOptions().scrollBar) {\n        css($htmlBody, {\n          'overflow': 'hidden',\n          'height': '100%'\n        });\n        removeClass($body, 'fp-scrollable');\n        setRecordHistory(getOriginals().recordHistory, 'internal'); //for IE touch devices\n\n        css(getContainer(), {\n          '-ms-touch-action': 'none',\n          'touch-action': 'none'\n        });\n\n        if (element != null) {\n          //moving the container up\n          silentScroll(element.offsetTop);\n        }\n      } else {\n        css($htmlBody, {\n          'overflow': 'visible',\n          'height': 'initial'\n        });\n        addClass($body, 'fp-scrollable');\n        var recordHistory = !getOptions().autoScrolling ? false : getOriginals().recordHistory;\n        setRecordHistory(recordHistory, 'internal'); //for IE touch devices\n\n        css(getContainer(), {\n          '-ms-touch-action': '',\n          'touch-action': ''\n        }); //scrolling the page to the section with no animation\n\n        if (element != null) {\n          var scrollSettings = getScrollSettings(element.offsetTop);\n          scrollSettings.element.scrollTo(0, scrollSettings.options);\n        }\n      }\n    }\n\n    //@ts-check\n    /**\n    * Adds sections before or after the current one to create the infinite effect.\n    */\n\n    function createInfiniteSections(v) {\n      setState({\n        isDoingContinousVertical: true\n      });\n      var activeSectionItem = getState().activeSection.item; // Scrolling down\n\n      if (!v.isMovementUp) {\n        // Move all previous sections to after the active section\n        after(activeSectionItem, prevAll(activeSectionItem, SECTION_SEL).reverse());\n      } else {\n        // Scrolling up\n        // Move all next sections to before the active section\n        before(activeSectionItem, nextAll(activeSectionItem, SECTION_SEL));\n      } // Maintain the displayed position (now that we changed the element order)\n\n\n      silentScroll(getState().activeSection.item.offsetTop); // Maintain the active slides visible in the viewport\n\n      keepSlidesPosition$1(); // save for later the elements that still need to be reordered\n\n      v.wrapAroundElements = activeSectionItem; // Recalculate animation variables\n\n      v.dtop = v.element.offsetTop;\n      v.yMovement = getYmovement(getState().activeSection, v.element);\n      return v;\n    }\n    /**\n    * Maintains the active slides in the viewport\n    * (Because the `scroll` animation might get lost with some actions, such as when using continuousVertical)\n    */\n\n    function keepSlidesPosition$1() {\n      var activeSlides = $(SLIDE_ACTIVE_SEL);\n\n      for (var i = 0; i < activeSlides.length; i++) {\n        silentLandscapeScroll(activeSlides[i], 'internal');\n      }\n    }\n\n    //@ts-check\n    /**\n    * Maintains the active slides in the viewport\n    * (Because the `scroll` animation might get lost with some actions, such as when using continuousVertical)\n    */\n\n    function keepSlidesPosition() {\n      var activeSlides = $(SLIDE_ACTIVE_SEL);\n\n      for (var i = 0; i < activeSlides.length; i++) {\n        silentLandscapeScroll(activeSlides[i], 'internal');\n      }\n    }\n    /**\n    * Fix section order after continuousVertical changes have been animated\n    */\n\n\n    function continuousVerticalFixSectionOrder(v) {\n      // If continuousVertical is in effect (and autoScrolling would also be in effect then),\n      // finish moving the elements around so the direct navigation will function more simply\n      if (v.wrapAroundElements == null) {\n        return;\n      }\n\n      if (v.isMovementUp) {\n        before($(SECTION_SEL)[0], v.wrapAroundElements);\n      } else {\n        after($(SECTION_SEL)[getState().sections.length - 1], v.wrapAroundElements);\n      }\n\n      silentScroll(getState().activeSection.item.offsetTop); // Maintain the active slides visible in the viewport\n\n      keepSlidesPosition();\n      setState({\n        isDoingContinousVertical: false\n      });\n    }\n\n    /**\n    * Makes sure lazyload is done for other sections in the viewport that are not the\n    * active one. \n    */\n\n    function lazyLoadOthers() {\n      var hasAutoHeightSections = $(AUTO_HEIGHT_SEL)[0] || isResponsiveMode() && $(AUTO_HEIGHT_RESPONSIVE_SEL)[0]; //quitting when it doesn't apply\n\n      if (!getOptions().lazyLoading || !hasAutoHeightSections) {\n        return;\n      } //making sure to lazy load auto-height sections that are in the viewport\n\n\n      $(SECTION_SEL + ':not(' + ACTIVE_SEL + ')').forEach(function (section) {\n        if (isSectionInViewport(section)) {\n          lazyLoad(section);\n        }\n      });\n    }\n    /**\n    * Determines whether a section is in the viewport or not.\n    */\n\n    function isSectionInViewport(el) {\n      var rect = el.getBoundingClientRect();\n      var top = rect.top;\n      var bottom = rect.bottom; //sometimes there's a 1px offset on the bottom of the screen even when the \n      //section's height is the window.innerHeight one. I guess because pixels won't allow decimals.\n      //using this prevents from lazyLoading the section that is not yet visible \n      //(only 1 pixel offset is)\n\n      var pixelOffset = 2;\n      var isTopInView = top + pixelOffset < state.windowsHeight && top > 0;\n      var isBottomInView = bottom > pixelOffset && bottom < state.windowsHeight;\n      return isTopInView || isBottomInView;\n    }\n\n    function tooltipTextHandler() {\n      /*jshint validthis:true */\n      trigger(prev(this), 'click');\n    }\n    /**\n    * Activating the vertical navigation bullets according to the given slide name.\n    */\n\n    function activateNavDots(name, sectionIndex) {\n      var nav = $(SECTION_NAV_SEL)[0];\n\n      if (getOptions().navigation && nav != null && nav.style.display !== 'none') {\n        removeClass($(ACTIVE_SEL, nav), ACTIVE);\n\n        if (name) {\n          addClass($('a[href=\"#' + name + '\"]', nav), ACTIVE);\n        } else {\n          addClass($('a', $('li', nav)[sectionIndex]), ACTIVE);\n        }\n      }\n    }\n    /**\n    * Creates a vertical navigation bar.\n    */\n\n    function addVerticalNavigation() {\n      remove($(SECTION_NAV_SEL));\n      var navigation = doc.createElement('div');\n      navigation.setAttribute('id', SECTION_NAV);\n      var divUl = doc.createElement('ul');\n      navigation.appendChild(divUl);\n      appendTo(navigation, $body);\n      var nav = $(SECTION_NAV_SEL)[0];\n      addClass(nav, 'fp-' + getOptions().navigationPosition);\n\n      if (getOptions().showActiveTooltip) {\n        addClass(nav, SHOW_ACTIVE_TOOLTIP);\n      }\n\n      var li = '';\n\n      for (var i = 0; i < getState().sections.length; i++) {\n        var section = getState().sections[i];\n        var link = '';\n\n        if (getOptions().anchors.length) {\n          link = section.anchor;\n        }\n\n        li += '<li><a href=\"#' + encodeURI(link) + '\"><span class=\"fp-sr-only\">' + getBulletLinkName(section.index(), 'Section') + '</span><span></span></a>'; // Only add tooltip if needed (defined by user)\n\n        var tooltip = getOptions().navigationTooltips[section.index()];\n\n        if (typeof tooltip !== 'undefined' && tooltip !== '') {\n          li += '<div class=\"' + SECTION_NAV_TOOLTIP + ' fp-' + getOptions().navigationPosition + '\">' + tooltip + '</div>';\n        }\n\n        li += '</li>';\n      }\n\n      $('ul', nav)[0].innerHTML = li; //activating the current active section\n\n      var bullet = $('li', $(SECTION_NAV_SEL)[0])[getState().activeSection.index()];\n      addClass($('a', bullet), ACTIVE);\n    } //Scrolls to the section when clicking the navigation bullet\n\n    function sectionBulletHandler(e) {\n      if (e.preventDefault) {\n        preventDefault(e);\n      }\n\n      setState({\n        scrollTrigger: 'verticalNav'\n      });\n      /*jshint validthis:true */\n      // @ts-ignore\n\n      var indexBullet = index(closest(this, SECTION_NAV_SEL + ' li'));\n      EventEmitter.emit(events.scrollPage, {\n        destination: getState().sections[indexBullet]\n      });\n    }\n\n    /**\n    * Sets to active the current menu and vertical nav items.\n    */\n\n    function activateMenuAndNav(anchor, index) {\n      activateMenuElement(anchor);\n      activateNavDots(anchor, index);\n    }\n    /**\n    * Activating the website main menu elements according to the given slide name.\n    */\n\n    function activateMenuElement(name) {\n      if (getOptions().menu && getOptions().menu.length) {\n        $(getOptions().menu).forEach(function (menu) {\n          if (menu != null) {\n            removeClass($(ACTIVE_SEL, menu), ACTIVE);\n            addClass($('[data-menuanchor=\"' + name + '\"]', menu), ACTIVE);\n          }\n        });\n      }\n    }\n\n    new Date().getTime();\n    /**\n     * Triggers the callback once per scroll wheel action.\n     * Based on scrolling speed delay.\n     */\n\n    var oncePerScroll = function () {\n      var canTriggerEvent = true;\n      var prevWheelTime = new Date().getTime();\n      var result;\n      var isScrollingOnInit = !win.fullpage_api;\n      return function (scrollTrigger, callback) {\n        var currentTime = new Date().getTime();\n        var timeThreshold = scrollTrigger === 'wheel' ? getOptions().scrollingSpeed : 100;\n        canTriggerEvent = isScrollingOnInit || currentTime - prevWheelTime >= timeThreshold;\n        isScrollingOnInit = !win.fullpage_api;\n\n        if (canTriggerEvent) {\n          result = callback();\n          prevWheelTime = currentTime;\n        }\n\n        return typeof result !== 'undefined' ? result : true;\n      };\n    }();\n\n    /**\n    * Fires the wheel event once per mouse wheel trigger.\n    */\n\n    function fireCallbackOncePerScroll(callbackName, params) {\n      if (!isFunction(getOptions().beforeLeave)) {\n        return;\n      }\n\n      var result = oncePerScroll(getState().scrollTrigger, function () {\n        return fireCallback(callbackName, params);\n      });\n      return result;\n    }\n\n    FP.moveTo = moveTo;\n\n    FP.getScrollY = function () {\n      return state.scrollY;\n    };\n\n    var g_afterSectionLoadsId;\n    var g_transitionLapseId;\n    EventEmitter.on(events.onDestroy, onDestroy$8);\n    /**\n    * Scrolls the site to the given element and scrolls to the slide if a callback is given.\n    */\n\n    function scrollPage(section, callback, isMovementUp) {\n      var element = section.item;\n\n      if (element == null) {\n        return;\n      } //there's no element to scroll, leaving the function\n\n\n      var dtop = getDestinationPosition(element);\n      var slideAnchorLink;\n      var slideIndex; //local variables\n\n      var v = {\n        \"element\": element,\n        \"callback\": callback,\n        \"isMovementUp\": isMovementUp,\n        \"dtop\": dtop,\n        \"yMovement\": getYmovement(getState().activeSection, element),\n        \"anchorLink\": section.anchor,\n        \"sectionIndex\": section.index(),\n        \"activeSlide\": section.activeSlide ? section.activeSlide.item : null,\n        \"leavingSection\": getState().activeSection.index() + 1,\n        //caching the value of isResizing at the momment the function is called\n        //because it will be checked later inside a setTimeout and the value might change\n        \"localIsResizing\": state.isResizing,\n        \"items\": {\n          \"origin\": getState().activeSection,\n          \"destination\": section\n        },\n        \"direction\": null\n      }; //quiting when destination scroll is the same as the current one\n\n      if (getState().activeSection.item == element && !state.isResizing || getOptions().scrollBar && getScrollTop() === v.dtop && !hasClass(element, AUTO_HEIGHT)) {\n        return;\n      }\n\n      if (v.activeSlide != null) {\n        slideAnchorLink = getAttr(v.activeSlide, 'data-anchor');\n        slideIndex = index(v.activeSlide, null);\n      } //callback (onLeave) if the site is not just resizing and readjusting the slides\n\n\n      if (!v.localIsResizing) {\n        var direction = v.yMovement; //required for continousVertical\n\n        if (typeof isMovementUp !== 'undefined') {\n          direction = isMovementUp ? 'up' : 'down';\n        } //for the callback\n\n\n        v.direction = direction;\n\n        if (isFunction(getOptions().beforeLeave)) {\n          if (fireCallbackOncePerScroll('beforeLeave', v) === false) {\n            return;\n          }\n        }\n\n        if (isFunction(getOptions().onLeave)) {\n          if (!fireCallback('onLeave', v)) {\n            return;\n          }\n        }\n      } // If continuousVertical && we need to wrap around\n\n\n      if (getOptions().autoScrolling && getOptions().continuousVertical && typeof v.isMovementUp !== \"undefined\" && (!v.isMovementUp && v.yMovement == 'up' || // Intending to scroll down but about to go up or\n      v.isMovementUp && v.yMovement == 'down')) {\n        // intending to scroll up but about to go down\n        v = createInfiniteSections(v);\n      } //pausing media of the leaving section (if we are not just resizing, as destinatino will be the same one)\n\n\n      if (!v.localIsResizing) {\n        stopMedia(getState().activeSection.item);\n      }\n\n      addClass(element, ACTIVE);\n      removeClass(siblings(element), ACTIVE);\n      updateState();\n      lazyLoad(element); //preventing from activating the MouseWheelHandler event\n      //more than once if the page is scrolling\n\n      setState({\n        canScroll: FP.test.isTesting\n      });\n      setPageStatus(slideIndex, slideAnchorLink, v.anchorLink);\n      EventEmitter.emit(events.onLeave, v);\n      performMovement(v); //flag to avoid callingn `scrollPage()` twice in case of using anchor links\n\n      setState({\n        lastScrolledDestiny: v.anchorLink\n      }); //avoid firing it twice (as it does also on scroll)\n\n      activateMenuAndNav(v.anchorLink, v.sectionIndex);\n    }\n\n    function onDestroy$8() {\n      clearTimeout(g_afterSectionLoadsId);\n      clearTimeout(g_transitionLapseId);\n    }\n    /**\n    * Returns the destination Y position based on the scrolling direction and\n    * the height of the section.\n    */\n\n\n    function getDestinationPosition(element) {\n      var elementHeight = element.offsetHeight;\n      var elementTop = element.offsetTop; //top of the desination will be at the top of the viewport\n\n      var position = elementTop;\n      var isScrollingDown = elementTop > state.previousDestTop;\n      var sectionBottom = position - getWindowHeight() + elementHeight;\n      var bigSectionsDestination = getOptions().bigSectionsDestination; //is the destination element bigger than the viewport?\n\n      if (elementHeight > getWindowHeight()) {\n        //scrolling up?\n        if (!isScrollingDown && !bigSectionsDestination || bigSectionsDestination === 'bottom') {\n          position = sectionBottom;\n        }\n      } //sections equal or smaller than the viewport height && scrolling down? ||  is resizing and its in the last section\n      else if (isScrollingDown || state.isResizing && next(element) == null) {\n        //The bottom of the destination will be at the bottom of the viewport\n        position = sectionBottom;\n      }\n      /*\n      Keeping record of the last scrolled position to determine the scrolling direction.\n      No conventional methods can be used as the scroll bar might not be present\n      AND the section might not be active if it is auto-height and didnt reach the middle\n      of the viewport.\n      */\n\n\n      setState({\n        previousDestTop: position\n      });\n      return position;\n    }\n    /**\n    * Performs the vertical movement (by CSS3 or by jQuery)\n    */\n\n\n    function performMovement(v) {\n      var isFastSpeed = getOptions().scrollingSpeed < 700;\n      var transitionLapse = isFastSpeed ? 700 : getOptions().scrollingSpeed;\n      setState({\n        touchDirection: 'none',\n        scrollY: Math.round(v.dtop)\n      });\n      EventEmitter.emit(events.onPerformMovement); // using CSS3 translate functionality\n\n      if (getOptions().css3 && getOptions().autoScrolling && !getOptions().scrollBar) {\n        // The first section can have a negative value in iOS 10. Not quite sure why: -0.0142822265625\n        // that's why we round it to 0.\n        var translate3d = 'translate3d(0px, -' + Math.round(v.dtop) + 'px, 0px)';\n        transformContainer(translate3d, true); //even when the scrollingSpeed is 0 there's a little delay, which might cause the\n        //scrollingSpeed to change in case of using silentMoveTo();ç\n\n        if (getOptions().scrollingSpeed) {\n          clearTimeout(g_afterSectionLoadsId);\n          g_afterSectionLoadsId = setTimeout(function () {\n            afterSectionLoads$1(v); //disabling canScroll when using fastSpeed\n\n            setState({\n              canScroll: !isFastSpeed || FP.test.isTesting\n            });\n          }, getOptions().scrollingSpeed);\n        } else {\n          afterSectionLoads$1(v);\n        }\n      } // using JS to animate\n      else {\n        var scrollSettings = getScrollSettings(v.dtop);\n        FP.test.top = -v.dtop + 'px';\n        clearTimeout(g_afterSectionLoadsId);\n        scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function () {\n          if (getOptions().scrollBar) {\n            /* Hack!\n            The timeout prevents setting the most dominant section in the viewport as \"active\" when the user\n            scrolled to a smaller section by using the mousewheel (auto scrolling) rather than draging the scroll bar.\n             When using scrollBar:true It seems like the scroll events still getting propagated even after the scrolling animation has finished.\n            */\n            g_afterSectionLoadsId = setTimeout(function () {\n              afterSectionLoads$1(v);\n            }, 30);\n          } else {\n            afterSectionLoads$1(v); //disabling canScroll when using fastSpeed\n\n            setState({\n              canScroll: !isFastSpeed || FP.test.isTesting\n            });\n          }\n        });\n      } // enabling canScroll after the minimum transition laps\n\n\n      if (isFastSpeed) {\n        clearTimeout(g_transitionLapseId);\n        g_transitionLapseId = setTimeout(function () {\n          setState({\n            canScroll: true\n          });\n        }, transitionLapse);\n      }\n    }\n    /**\n    * Actions to do once the section is loaded.\n    */\n\n\n    function afterSectionLoads$1(v) {\n      setState({\n        isBeyondFullpage: false\n      });\n      continuousVerticalFixSectionOrder(v); //callback (afterLoad) if the site is not just resizing and readjusting the slides\n\n      if (isFunction(getOptions().afterLoad) && !v.localIsResizing) {\n        fireCallback('afterLoad', v);\n      }\n\n      updateState();\n\n      if (!v.localIsResizing) {\n        playMedia(v.element);\n      }\n\n      addClass(v.element, COMPLETELY);\n      removeClass(siblings(v.element), COMPLETELY);\n      lazyLoadOthers();\n      setState({\n        canScroll: true\n      });\n      EventEmitter.emit(events.afterSectionLoads, v);\n\n      if (isFunction(v.callback)) {\n        v.callback();\n      }\n    }\n\n    FP.setFitToSection = setFitToSection;\n    FP.fitToSection = fitToSection;\n    /**\n    * Sets fitToSection\n    */\n\n    function setFitToSection(value, type) {\n      setVariableState('fitToSection', value, type);\n    }\n    /**\n    * Fits the site to the nearest active section\n    */\n\n    function fitToSection() {\n      //checking fitToSection again in case it was set to false before the timeout delay\n      if (state.canScroll) {\n        //allows to scroll to an active section and\n        //if the section is already active, we prevent firing callbacks\n        setState({\n          isResizing: true\n        });\n        scrollPage(state.activeSection);\n        setState({\n          isResizing: false\n        });\n      }\n    }\n\n    FP.setResponsive = setResponsive;\n    /**\n    * Checks if the site needs to get responsive and disables autoScrolling if so.\n    * A class `fp-responsive` is added to the plugin's container in case the user wants to use it for his own responsive CSS.\n    */\n\n    function responsive() {\n      var widthLimit = getOptions().responsive || getOptions().responsiveWidth; //backwards compatiblity\n\n      var heightLimit = getOptions().responsiveHeight; //only calculating what we need. Remember its called on the resize event.\n\n      var isBreakingPointWidth = widthLimit && win.innerWidth < widthLimit;\n      var isBreakingPointHeight = heightLimit && win.innerHeight < heightLimit;\n\n      if (widthLimit && heightLimit) {\n        setResponsive(isBreakingPointWidth || isBreakingPointHeight);\n      } else if (widthLimit) {\n        setResponsive(isBreakingPointWidth);\n      } else if (heightLimit) {\n        setResponsive(isBreakingPointHeight);\n      }\n    }\n    /**\n    * Turns fullPage.js to normal scrolling mode when the viewport `width` or `height`\n    * are smaller than the set limit values.\n    */\n\n    function setResponsive(active) {\n      var isResponsive = isResponsiveMode();\n\n      if (active) {\n        if (!isResponsive) {\n          setAutoScrolling(false, 'internal');\n          setFitToSection(false, 'internal');\n          hide($(SECTION_NAV_SEL));\n          addClass($body, RESPONSIVE);\n\n          if (isFunction(getOptions().afterResponsive)) {\n            getOptions().afterResponsive.call(getContainer(), active);\n          }\n        }\n      } else if (isResponsive) {\n        setAutoScrolling(getOriginals().autoScrolling, 'internal');\n        setFitToSection(getOriginals().autoScrolling, 'internal');\n        show($(SECTION_NAV_SEL));\n        removeClass($body, RESPONSIVE);\n\n        if (isFunction(getOptions().afterResponsive)) {\n          getOptions().afterResponsive.call(getContainer(), active);\n        }\n      }\n    }\n    /**\n    * Determines whether fullpage.js is in responsive mode or not.\n    */\n\n\n    function isResponsiveMode() {\n      return hasClass($body, RESPONSIVE);\n    }\n\n    function addTableClass(element) {\n      if (!getOptions().verticalCentered) {\n        return;\n      } // Overflowing sections when scrollOverflow is disabled will be autoHeight\n      // and won't require vertical aligment\n\n\n      if (!getOptions().scrollOverflow && scrollOverflowHandler.shouldBeScrollable(element.item)) {\n        return;\n      }\n\n      if (!scrollOverflowHandler.isScrollable(element)) {\n        //In case we are styling for the 2nd time as in with reponsiveSlides\n        if (!hasClass(element.item, TABLE)) {\n          addClass(element.item, TABLE);\n        }\n      }\n    }\n\n    var startingSection = null;\n    FP.getActiveSection = getActiveSection;\n    function getStartingSection() {\n      return startingSection;\n    }\n    /**\n    * Styling vertical sections\n    */\n\n    function styleSection(section) {\n      var sectionElem = section.item;\n      var hasSlides = section.allSlidesItems.length;\n      var index = section.index(); //if no active section is defined, the 1st one will be the default one\n\n      if (!getState().activeSection && section.isVisible) {\n        addClass(sectionElem, ACTIVE);\n        updateState();\n        startingSection = getState().activeSection.item;\n      }\n\n      if (getOptions().paddingTop) {\n        css(sectionElem, {\n          'padding-top': getOptions().paddingTop\n        });\n      }\n\n      if (getOptions().paddingBottom) {\n        css(sectionElem, {\n          'padding-bottom': getOptions().paddingBottom\n        });\n      }\n\n      if (typeof getOptions().sectionsColor[index] !== 'undefined') {\n        css(sectionElem, {\n          'background-color': getOptions().sectionsColor[index]\n        });\n      }\n\n      if (typeof getOptions().anchors[index] !== 'undefined') {\n        sectionElem.setAttribute('data-anchor', section.anchor);\n      }\n\n      if (!hasSlides) {\n        addTableClass(section);\n      }\n    }\n    /**\n    * Gets the active section.\n    */\n\n    function getActiveSection() {\n      return getState().activeSection;\n    }\n\n    function getSectionFromPanel(panel) {\n      return panel.isSection ? panel : panel.parent;\n    }\n\n    var g_focusScrollableId;\n    EventEmitter.on(events.bindEvents, bindEvents$b);\n\n    function bindEvents$b() {\n      // We can't focus scrollOverflow before scrolling\n      // to the anchor (if we need to)\n      EventEmitter.on(events.onAfterRenderNoAnchor, afterRender);\n      EventEmitter.on(events.onLeave, scrollOverflowHandler.onLeave);\n      EventEmitter.on(events.onSlideLeave, scrollOverflowHandler.onLeave);\n      EventEmitter.on(events.afterSlideLoads, scrollOverflowHandler.afterLoad);\n      EventEmitter.on(events.afterSectionLoads, scrollOverflowHandler.afterLoad);\n      EventEmitter.on(events.onDestroy, onDestroy$7);\n      docAddEvent('keyup', scrollOverflowHandler.keyUpHandler);\n    }\n\n    function afterRender() {\n      if (getOptions().scrollOverflow && !getOptions().scrollBar) {\n        scrollOverflowHandler.makeScrollable();\n        scrollOverflowHandler.focusScrollable();\n      }\n    }\n\n    function onDestroy$7() {\n      EventEmitter.removeListener(events.onAfterRenderNoAnchor, afterRender);\n      docRemoveEvent('keyup', scrollOverflowHandler.keyUpHandler);\n    }\n\n    var scrollOverflowHandler = {\n      focusedElem: null,\n      shouldFocusScrollable: true,\n      isInnerScrollAllowed: true,\n      timeBeforeReachingLimit: null,\n      timeLastScroll: null,\n      preventScrollWithMouseWheel: function preventScrollWithMouseWheel(e) {\n        if (!state.canScroll) {\n          preventDefault(e);\n          return false;\n        }\n      },\n      preventScrollWithKeyboard: function preventScrollWithKeyboard(e) {\n        if (!isInsideInput() && getOptions().keyboardScrolling) {\n          var directionKeys = [38, 33, 32, 40, 34, 36, 35];\n\n          if (directionKeys.indexOf(e.keyCode) > -1 && !scrollOverflowHandler.isInnerScrollAllowed) {\n            preventDefault(e);\n            return false;\n          }\n        }\n      },\n      keyUpHandler: function keyUpHandler() {\n        scrollOverflowHandler.shouldFocusScrollable = state.canScroll;\n      },\n      // Leaving sections or slides\n      onLeave: function onLeave() {\n        clearTimeout(g_focusScrollableId);\n        scrollOverflowHandler.isInnerScrollAllowed = false;\n      },\n      // Loading sections or slides\n      afterLoad: function afterLoad() {\n        scrollOverflowHandler.isInnerScrollAllowed = false; // Delaying it to avoid issues on Safari when focusing elements #4484 & #4493\n\n        clearTimeout(g_focusScrollableId);\n        g_focusScrollableId = setTimeout(function () {\n          scrollOverflowHandler.shouldFocusScrollable = state.canScroll;\n        }, 200);\n      },\n      // Unfocusing the scrollable element from the orgin section/slide\n      unfocusScrollable: function unfocusScrollable() {\n        if (doc.activeElement === this.focusedElem) {\n          // @ts-ignore\n          this.focusedElem.blur();\n          scrollOverflowHandler.isInnerScrollAllowed = false;\n        }\n      },\n      focusScrollable: function focusScrollable() {\n        if (!getOptions().scrollOverflow || !scrollOverflowHandler.shouldFocusScrollable) {\n          return;\n        }\n\n        scrollOverflowHandler.unfocusScrollable();\n        var scrollableItem = scrollOverflowHandler.getScrollableItem(getState().activeSection.item); // On desktop we focus the scrollable to be able to use the mouse wheel\n        // We avoid it on mobile due to a bug in iOS Safari\n\n        if (scrollableItem && !isTouchDevice && !isTouch) {\n          this.focusedElem = scrollableItem; // Forcing the focus on the next paint \n          // to avoid issue #4484 & #4493 on Safari\n\n          requestAnimationFrame(function () {\n            scrollableItem.focus();\n            scrollOverflowHandler.isInnerScrollAllowed = true;\n          });\n        }\n\n        scrollOverflowHandler.shouldFocusScrollable = false;\n      },\n      makeScrollable: function makeScrollable() {\n        if (getOptions().scrollOverflowMacStyle && !isMacDevice) {\n          addClass($body, 'fp-scroll-mac');\n        }\n\n        getState().panels.forEach(function (el) {\n          if (el.slides && el.slides.length) {\n            return;\n          }\n\n          if (hasClass(el.item, AUTO_HEIGHT_RESPONSIVE) && isResponsiveMode()) {\n            return;\n          } else {\n            var item = getSlideOrSection(el.item);\n            var shouldBeScrollable = scrollOverflowHandler.shouldBeScrollable(el.item);\n            var section = getSectionFromPanel(el);\n\n            if (isIE11) {\n              var toggleAction = shouldBeScrollable ? 'addClass' : 'removeClass';\n              utils[toggleAction](section.item, IS_OVERFLOW);\n              utils[toggleAction](el.item, IS_OVERFLOW);\n            } else {\n              addClass(section.item, IS_OVERFLOW);\n              addClass(el.item, IS_OVERFLOW);\n            }\n\n            if (!el.hasScroll) {\n              scrollOverflowHandler.createWrapper(item);\n              scrollOverflowHandler.bindEvents(item);\n            } // updating the state now in case \n            // this is executed on page load (after images load)\n\n\n            el.hasScroll = true;\n          }\n        });\n      },\n      bindEvents: function bindEvents(item) {\n        scrollOverflowHandler.getScrollableItem(item).addEventListener('scroll', scrollOverflowHandler.onPanelScroll);\n        item.addEventListener('wheel', scrollOverflowHandler.preventScrollWithMouseWheel, {\n          passive: false\n        });\n        item.addEventListener('keydown', scrollOverflowHandler.preventScrollWithKeyboard, {\n          passive: false\n        });\n      },\n      createWrapper: function createWrapper(item) {\n        var overflowWrapper = document.createElement('div');\n        overflowWrapper.className = OVERFLOW;\n        wrapInner(item, overflowWrapper);\n        overflowWrapper.setAttribute('tabindex', '-1');\n      },\n      destroyWrapper: function destroyWrapper(item) {\n        var overflowWrapper = $(OVERFLOW_SEL, item)[0];\n\n        if (overflowWrapper) {\n          unwrap(overflowWrapper);\n          item.removeAttribute('tabindex');\n        }\n      },\n      getScrollableItem: function getScrollableItem(sectionItem) {\n        var panel = getSlideOrSection(sectionItem);\n        return $(OVERFLOW_SEL, panel)[0] || panel;\n      },\n      hasScroll: function hasScroll(panelItem) {\n        return hasClass(panelItem, OVERFLOW) || $(OVERFLOW_SEL, panelItem)[0] != null;\n      },\n      isScrollable: function isScrollable(panel) {\n        return panel.isSection && panel.activeSlide ? panel.activeSlide.hasScroll : panel.hasScroll;\n      },\n      shouldBeScrollable: function shouldBeScrollable(item) {\n        var scrollable = scrollOverflowHandler.getScrollableItem(item);\n        return scrollable.scrollHeight > win.innerHeight;\n      },\n      isScrolled: function isScrolled(direction, el) {\n        if (!state.canScroll) {\n          return false;\n        } // we won't allow scrolloverflow on scrollBar:true\n\n\n        if (getOptions().scrollBar) {\n          return true;\n        }\n\n        var scrollableItem = scrollOverflowHandler.getScrollableItem(el);\n\n        if (!getOptions().scrollOverflow || !hasClass(scrollableItem, OVERFLOW) || // Checking the section first \n        // In case they apply to both section + slide #4505\n        hasClass(el, 'fp-noscroll') || // Checking the slide (in case it has)\n        hasClass(getSlideOrSection(el), 'fp-noscroll')) {\n          return true;\n        } // ie11 wrongly calculates scrollHeight when using the CSS style\n        // overflow: auto   It adds 1 more pixel compared to offsetHeight\n\n\n        var ie11offset = isIE11 ? 1 : 0;\n        var positionY = scrollableItem.scrollTop;\n        var isTopReached = direction === 'up' && positionY <= 0;\n        var isBottomReached = direction === 'down' && scrollableItem.scrollHeight <= Math.ceil(scrollableItem.offsetHeight + positionY) + ie11offset;\n        var isScrolled = isTopReached || isBottomReached;\n\n        if (!isScrolled) {\n          this.timeBeforeReachingLimit = new Date().getTime();\n        }\n\n        return isScrolled;\n      },\n      shouldMovePage: function shouldMovePage() {\n        this.timeLastScroll = new Date().getTime();\n        var timeDiff = this.timeLastScroll - scrollOverflowHandler.timeBeforeReachingLimit;\n        var isUsingTouch = isTouchDevice || isTouch;\n        var isGrabbing = isUsingTouch && state.isGrabbing;\n        var isNotFirstTimeReachingLimit = state.isUsingWheel && timeDiff > 600;\n        return isGrabbing && timeDiff > 400 || isNotFirstTimeReachingLimit;\n      },\n      onPanelScroll: function () {\n        var prevPosition = 0;\n        return function (e) {\n          var currentPosition = e.target.scrollTop;\n          var direction = state.touchDirection !== 'none' ? state.touchDirection : prevPosition < currentPosition ? 'down' : 'up';\n          prevPosition = currentPosition;\n\n          if (isFunction(getOptions().onScrollOverflow)) {\n            fireCallback('onScrollOverflow', {\n              position: currentPosition,\n              direction: direction\n            });\n          }\n\n          if (hasClass(e.target, OVERFLOW) && state.canScroll) {\n            if (scrollOverflowHandler.isScrolled(direction, e.target) && scrollOverflowHandler.shouldMovePage()) {\n              // Checking again if we have a scrollable content\n              // To avoid issues like #4479 where the scroll event gets\n              // triggered after removing/hidding content if this was scrolled\n              if (scrollOverflowHandler.shouldBeScrollable(getState().activeSection.item)) {\n                EventEmitter.emit(events.onScrollOverflowScrolled, {\n                  direction: direction\n                });\n              }\n            }\n          }\n        };\n      }()\n    };\n\n    var g_afterSlideLoadsId;\n    FP.landscapeScroll = landscapeScroll;\n    EventEmitter.on(events.bindEvents, bindEvents$a);\n\n    function bindEvents$a() {\n      EventEmitter.on(events.onPerformMovement, onPerformMovement);\n    }\n\n    function onPerformMovement() {\n      clearTimeout(g_afterSlideLoadsId);\n      setState({\n        slideMoving: false\n      });\n    }\n    /**\n    * Scrolls horizontal sliders.\n    */\n\n\n    function landscapeScroll(slides, destiny, direction) {\n      var sectionElem = closest(slides, SECTION_SEL);\n      var section = getState().sections.filter(function (section) {\n        return section.item == sectionElem;\n      })[0];\n      var slide = section.slides.filter(function (slide) {\n        return slide.item == destiny;\n      })[0];\n      var v = {\n        \"slides\": slides,\n        \"destiny\": destiny,\n        \"direction\": direction,\n        \"destinyPos\": {\n          \"left\": destiny.offsetLeft\n        },\n        \"slideIndex\": slide.index(),\n        \"section\": sectionElem,\n        \"sectionIndex\": section.index(),\n        \"anchorLink\": section.anchor,\n        \"slidesNav\": $(SLIDES_NAV_SEL, sectionElem)[0],\n        \"slideAnchor\": slide.anchor,\n        \"prevSlide\": section.activeSlide.item,\n        \"prevSlideIndex\": section.activeSlide.index(),\n        \"items\": {\n          \"section\": section,\n          \"origin\": section.activeSlide,\n          \"destination\": slide\n        },\n        //caching the value of isResizing at the momment the function is called\n        //because it will be checked later inside a setTimeout and the value might change\n        \"localIsResizing\": state.isResizing\n      };\n      v.xMovement = getXmovement(v.prevSlideIndex, v.slideIndex);\n      v.direction = v.direction ? v.direction : v.xMovement; //important!! Only do it when not resizing\n\n      if (!v.localIsResizing) {\n        //preventing from scrolling to the next/prev section when using scrollHorizontally\n        setState({\n          canScroll: false\n        });\n      }\n\n      if (getOptions().onSlideLeave) {\n        //if the site is not just resizing and readjusting the slides\n        if (!v.localIsResizing && v.xMovement !== 'none') {\n          if (isFunction(getOptions().onSlideLeave)) {\n            if (fireCallback('onSlideLeave', v) === false) {\n              setState({\n                slideMoving: false\n              });\n              return;\n            }\n          }\n        }\n      }\n\n      addClass(destiny, ACTIVE);\n      removeClass(siblings(destiny), ACTIVE);\n      updateState();\n\n      if (!v.localIsResizing) {\n        stopMedia(v.prevSlide);\n        lazyLoad(destiny);\n      }\n\n      toggleControlArrows(v); //only changing the URL if the slides are in the current section (not for resize re-adjusting)\n\n      if (section.isActive && !v.localIsResizing) {\n        setPageStatus(v.slideIndex, v.slideAnchor, v.anchorLink);\n      }\n\n      EventEmitter.emit(events.onSlideLeave, v);\n      performHorizontalMove(slides, v, true);\n    }\n    /**\n    * Performs the horizontal movement. (CSS3 or jQuery)\n    *\n    * @param fireCallback {Boolean} - determines whether or not to fire the callback\n    */\n\n    function performHorizontalMove(slides, v, fireCallback) {\n      var destinyPos = v.destinyPos;\n      activeSlidesNavigation(v.slidesNav, v.slideIndex);\n      setState({\n        scrollX: Math.round(destinyPos.left)\n      });\n\n      if (getOptions().css3) {\n        var translate3d = 'translate3d(-' + Math.round(destinyPos.left) + 'px, 0px, 0px)';\n        FP.test.translate3dH[v.sectionIndex] = translate3d;\n        css(addAnimation($(SLIDES_CONTAINER_SEL, slides)), getTransforms(translate3d));\n        clearTimeout(g_afterSlideLoadsId);\n        g_afterSlideLoadsId = setTimeout(function () {\n          if (fireCallback) {\n            afterSlideLoads(v);\n          }\n        }, getOptions().scrollingSpeed);\n      } else {\n        FP.test.left[v.sectionIndex] = Math.round(destinyPos.left);\n        scrollTo(slides, Math.round(destinyPos.left), getOptions().scrollingSpeed, function () {\n          if (fireCallback) {\n            afterSlideLoads(v);\n          }\n        });\n      }\n    }\n    /**\n    * Retuns `right` or `left` depending on the scrolling movement to reach its destination\n    * from the current slide.\n    */\n\n\n    function getXmovement(fromIndex, toIndex) {\n      if (fromIndex == toIndex) {\n        return 'none';\n      }\n\n      if (fromIndex > toIndex) {\n        return 'left';\n      }\n\n      return 'right';\n    }\n\n    function onDestroy$6() {\n      clearTimeout(g_afterSlideLoadsId);\n    }\n\n    function afterSlideLoads(v) {\n      //if the site is not just resizing and readjusting the slides\n      if (!v.localIsResizing) {\n        if (isFunction(getOptions().afterSlideLoad)) {\n          fireCallback('afterSlideLoad', v);\n        } //needs to be inside the condition to prevent problems with continuousVertical and scrollHorizontally\n        //and to prevent double scroll right after a windows resize\n\n\n        setState({\n          canScroll: true\n        });\n        playMedia(v.destiny);\n        EventEmitter.emit(events.afterSlideLoads, v);\n      } //letting them slide again\n\n\n      setState({\n        slideMoving: false\n      });\n    }\n\n    /**\n    * Slides silently (with no animation) the active slider to the given slide.\n    * @param noCallback {bool} true or defined -> no callbacks\n    */\n\n    function silentLandscapeScroll(activeSlide, noCallbacks) {\n      setScrollingSpeed(0, 'internal');\n\n      if (typeof noCallbacks !== 'undefined') {\n        //preventing firing callbacks afterSlideLoad etc.\n        setState({\n          isResizing: true\n        });\n      }\n\n      landscapeScroll(closest(activeSlide, SLIDES_WRAPPER_SEL), activeSlide);\n\n      if (typeof noCallbacks !== 'undefined') {\n        setState({\n          isResizing: false\n        });\n      }\n\n      setScrollingSpeed(getOriginals().scrollingSpeed, 'internal');\n    }\n\n    var g_prevActiveSectionIndex = null;\n    var g_prevActiveSlideIndex = null;\n    /** \n     * Updates the state of the app.\n     */\n\n    function updateState() {\n      state.activeSection = null;\n      state.sections.map(function (section) {\n        var isActive = hasClass(section.item, ACTIVE);\n        section.isActive = isActive;\n        section.hasScroll = scrollOverflowHandler.hasScroll(section.item);\n\n        if (isActive) {\n          state.activeSection = section;\n        }\n\n        if (section.slides.length) {\n          section.activeSlide = null;\n          section.slides.map(function (slide) {\n            var isActiveSlide = hasClass(slide.item, ACTIVE);\n            slide.hasScroll = scrollOverflowHandler.hasScroll(section.item);\n            slide.isActive = isActiveSlide;\n\n            if (isActiveSlide) {\n              section.activeSlide = slide;\n            }\n          });\n        }\n      });\n      scrollToNewActivePanel();\n    }\n    function updateStructuralState() {\n      var allSectionItems = $(getOptions().sectionSelector, getContainer());\n      var sectionsItems = getVisible(allSectionItems);\n      var allSections = Array.from(allSectionItems).map(function (item) {\n        return new SectionPanel(item);\n      });\n      var sections = allSections.filter(function (item) {\n        return item.isVisible;\n      });\n      var slides = sections.reduce(function (acc, section) {\n        return acc.concat(section.slides);\n      }, []); // keeping track of the previously active section\n\n      g_prevActiveSectionIndex = getPrevActivePanelIndex(state.activeSection);\n      g_prevActiveSlideIndex = getPrevActivePanelIndex(state.activeSection ? state.activeSection.activeSlide : null);\n      state.numSections = sectionsItems.length;\n      state.numSlides = sections.reduce(function (acc, section) {\n        return acc + section.slides.length;\n      }, 0);\n      state.sections = sections;\n      state.sectionsIncludingHidden = allSections;\n      state.slides = slides;\n      state.panels = state.sections.concat(state.slides);\n    }\n\n    function getPrevActivePanelIndex(activePanel) {\n      if (!activePanel) {\n        return null;\n      }\n\n      var prevActivePanelItem = activePanel ? activePanel.item : null;\n      var hiddenPanels = activePanel.isSection ? state.sectionsIncludingHidden : state.activeSection.slidesIncludingHidden;\n\n      if (prevActivePanelItem) {\n        var panel = getPanelByElement(hiddenPanels, prevActivePanelItem);\n        return panel ? panel.index() : null;\n      }\n\n      return null;\n    }\n    /**\n     * When changes in the DOM take place there's a change \n     * the active section is now hidden or removed. \n     * fullPage.js will scroll to the closest section nearby.\n     */\n\n\n    function scrollToNewActivePanel() {\n      var activeSection = state.activeSection;\n      var activeSectionHasSlides = state.activeSection ? state.activeSection.slides.length : false;\n      var activeSlide = state.activeSection ? state.activeSection.activeSlide : null; // Hidding / removing the active section ?\n\n      if (!activeSection && state.sections.length && !getState().isBeyondFullpage && g_prevActiveSectionIndex) {\n        var newActiveSection = getNewActivePanel(g_prevActiveSectionIndex, state.sections);\n\n        if (newActiveSection) {\n          state.activeSection = newActiveSection;\n          state.activeSection.isActive = true;\n          addClass(state.activeSection.item, ACTIVE);\n        }\n\n        if (state.activeSection) {\n          silentScroll(state.activeSection.item.offsetTop);\n        }\n      }\n\n      if (activeSectionHasSlides && !activeSlide && g_prevActiveSlideIndex) {\n        var newActiveSlide = getNewActivePanel(g_prevActiveSlideIndex, state.activeSection.slides);\n\n        if (newActiveSlide) {\n          state.activeSection.activeSlide = newActiveSlide;\n          state.activeSection.activeSlide.isActive = true;\n          addClass(state.activeSection.activeSlide.item, ACTIVE);\n        }\n\n        if (state.activeSection.activeSlide) {\n          silentLandscapeScroll(state.activeSection.activeSlide.item, 'internal');\n        }\n      }\n    }\n\n    function getNewActivePanel(prevActivePanelIndex, siblings) {\n      var newActiveSection;\n      var prevIndex = prevActivePanelIndex - 1;\n      var nextIndex = prevActivePanelIndex;\n\n      do {\n        newActiveSection = siblings[prevIndex] || siblings[nextIndex];\n\n        if (newActiveSection) {\n          break;\n        }\n\n        prevIndex = prevIndex - 1;\n        nextIndex = nextIndex + 1;\n      } while (prevIndex >= 0 || nextIndex < siblings.length);\n\n      return newActiveSection;\n    }\n    /**\n    * Section object\n    */\n\n\n    var SectionPanel = function SectionPanel(el) {\n      var _this = this;\n\n      [].push.call(arguments, getOptions().sectionSelector);\n      Item.apply(this, arguments);\n      this.allSlidesItems = $(getOptions().slideSelector, el);\n      this.slidesIncludingHidden = Array.from(this.allSlidesItems).map(function (item) {\n        return new SlidePanel(item, _this);\n      });\n      this.slides = this.slidesIncludingHidden.filter(function (slidePanel) {\n        return slidePanel.isVisible;\n      });\n      this.activeSlide = this.slides.length ? this.slides.filter(function (slide) {\n        return slide.isActive;\n      })[0] || this.slides[0] : null;\n    };\n    SectionPanel.prototype = Item.prototype;\n    SectionPanel.prototype.constructor = SectionPanel;\n    /**\n    * Slide object\n    */\n\n    var SlidePanel = function SlidePanel(el, section) {\n      this.parent = section;\n      Item.call(this, el, getOptions().slideSelector);\n    };\n\n    SlidePanel.prototype = Item.prototype;\n    SlidePanel.prototype.constructor = SectionPanel;\n\n    /**\n    * Adds internal classes to be able to provide customizable selectors\n    * keeping the link with the style sheet.\n    */\n\n    function addInternalSelectors() {\n      addClass($(getOptions().sectionSelector, getContainer()), SECTION);\n      addClass($(getOptions().slideSelector, getContainer()), SLIDE);\n    }\n\n    /**\n    * Styles the horizontal slides for a section.\n    */\n\n    function styleSlides(section) {\n      var numSlides = section.slides.length;\n      var slidesElems = section.allSlidesItems;\n      var slides = section.slides;\n      var sliderWidth = numSlides * 100;\n      var slideWidth = 100 / numSlides;\n\n      if (!$(SLIDES_WRAPPER_SEL, section.item)[0]) {\n        var slidesWrapper = doc.createElement('div');\n        slidesWrapper.className = SLIDES_WRAPPER; //fp-slides\n\n        wrapAll(slidesElems, slidesWrapper);\n        var slidesContainer = doc.createElement('div');\n        slidesContainer.className = SLIDES_CONTAINER; //fp-slidesContainer\n\n        wrapAll(slidesElems, slidesContainer);\n      }\n\n      css($(SLIDES_CONTAINER_SEL, section.item), {\n        'width': sliderWidth + '%'\n      });\n\n      if (numSlides > 1) {\n        if (getOptions().controlArrows) {\n          createSlideArrows(section);\n        }\n\n        if (getOptions().slidesNavigation) {\n          addSlidesNavigation(section);\n        }\n      }\n\n      slides.forEach(function (slide) {\n        css(slide.item, {\n          'width': slideWidth + '%'\n        });\n\n        if (getOptions().verticalCentered) {\n          addTableClass(slide);\n        }\n      });\n      var startingSlide = section.activeSlide || null; //if the slide won't be an starting point, the default will be the first one\n      //the active section isn't the first one? Is not the first slide of the first section? Then we load that section/slide by default.\n\n      if (startingSlide != null && state.activeSection && (state.activeSection.index() !== 0 || state.activeSection.index() === 0 && startingSlide.index() !== 0)) {\n        silentLandscapeScroll(startingSlide.item, 'internal');\n      } else {\n        addClass(slidesElems[0], ACTIVE);\n      }\n    }\n\n    var g_wrapperObserver;\n    var g_wrapperObserveConfig = {\n      attributes: false,\n      subtree: true,\n      childList: true,\n      characterData: true\n    };\n    EventEmitter.on(events.bindEvents, bindEvents$9);\n    FP[\"render\"] = onContentChange;\n\n    function bindEvents$9() {\n      if (getOptions().observer && \"MutationObserver\" in window && $(WRAPPER_SEL)[0]) {\n        g_wrapperObserver = createObserver($(WRAPPER_SEL)[0], onContentChange, g_wrapperObserveConfig);\n      }\n\n      EventEmitter.on(events.contentChanged, onContentChange);\n    }\n    /**\n     * Creates a Mutation observer.\n     */\n\n\n    function createObserver(target, callback, config) {\n      var observer = new MutationObserver(callback);\n      observer.observe(target, config);\n      return observer;\n    }\n\n    function didSlidesChange() {\n      return getVisible($(getOptions().slideSelector, getContainer())).length !== getState().numSlides;\n    }\n\n    function didSectionsChange() {\n      return getVisible($(getOptions().sectionSelector, getContainer())).length !== getState().numSections;\n    }\n\n    function didSectionsOrSlidesChange() {\n      return didSlidesChange() || didSectionsChange();\n    }\n    /**\n     * Listen to changes on sections and fires reBuild\n     * when those changes affect the section height.\n     */\n\n\n    function onContentChange(mutations) {\n      var _didSlidesChange = didSlidesChange();\n\n      if (didSectionsOrSlidesChange() && !state.isDoingContinousVertical) {\n        if (getOptions().observer && g_wrapperObserver) {\n          // Temporally disabling the observer while \n          // we modidy the DOM again\n          g_wrapperObserver.disconnect();\n        }\n\n        updateStructuralState();\n        updateState(); // Removing navs and anchors options\n\n        getOptions().anchors = [];\n        remove($(SECTION_NAV_SEL));\n        addInternalSelectors();\n        setOptionsFromDOM();\n\n        if (getOptions().navigation) {\n          addVerticalNavigation();\n        }\n\n        if (_didSlidesChange) {\n          remove($(SLIDES_NAV_SEL));\n          remove($(SLIDES_ARROW_SEL));\n        }\n\n        getState().sections.forEach(function (section) {\n          if (section.slides.length) {\n            if (_didSlidesChange) {\n              styleSlides(section);\n            }\n          } else {\n            styleSection(section);\n          }\n        });\n      }\n\n      if (getOptions().observer && g_wrapperObserver && $(WRAPPER_SEL)[0]) {\n        g_wrapperObserver.observe($(WRAPPER_SEL)[0], g_wrapperObserveConfig);\n      }\n    }\n\n    var supportsPassiveEvents = function () {\n      //cheks for passive event support\n      var g_supportsPassive = false;\n\n      try {\n        var opts = Object.defineProperty({}, 'passive', {\n          get: function get() {\n            g_supportsPassive = true;\n          }\n        });\n        windowAddEvent(\"testPassive\", null, opts);\n        windowRemoveEvent(\"testPassive\", null, opts);\n      } catch (e) {}\n\n      return function () {\n        return g_supportsPassive;\n      };\n    }();\n\n    function getPassiveOptionsIfPossible() {\n      return supportsPassiveEvents() ? {\n        passive: false\n      } : false;\n    }\n\n    var wheelDataHandler = function () {\n      var _prevTime = new Date().getTime();\n\n      var _scrollings = [];\n      var isScrollingVertically;\n      var direction;\n      return {\n        registerEvent: function registerEvent(e) {\n          e = e || win.event;\n          var value = e.wheelDelta || -e.deltaY || -e.detail;\n          var delta = Math.max(-1, Math.min(1, value));\n          var horizontalDetection = typeof e.wheelDeltaX !== 'undefined' || typeof e.deltaX !== 'undefined';\n          isScrollingVertically = Math.abs(e.wheelDeltaX) < Math.abs(e.wheelDelta) || Math.abs(e.deltaX) < Math.abs(e.deltaY) || !horizontalDetection;\n          var curTime = new Date().getTime();\n          direction = delta < 0 ? 'down' : 'up'; //Limiting the array to 150 (lets not waste memory!)\n\n          if (_scrollings.length > 149) {\n            _scrollings.shift();\n          } //keeping record of the previous scrollings\n\n\n          _scrollings.push(Math.abs(value)); //time difference between the last scroll and the current one\n\n\n          var timeDiff = curTime - _prevTime;\n          _prevTime = curTime; //haven't they scrolled in a while?\n          //(enough to be consider a different scrolling action to scroll another section)\n\n          if (timeDiff > 200) {\n            //emptying the array, we dont care about old scrollings for our averages\n            _scrollings = [];\n          }\n        },\n        isAccelerating: function isAccelerating() {\n          var averageEnd = getAverage(_scrollings, 10);\n          var averageMiddle = getAverage(_scrollings, 70);\n          var isAccelerating = averageEnd >= averageMiddle;\n          return _scrollings.length ? isAccelerating && isScrollingVertically : false;\n        },\n        getDirection: function getDirection() {\n          return direction;\n        }\n      };\n    }();\n\n    function scrollBeyondFullPage() {\n      var dtop = getDestinationOffset();\n      var scrollSettings = getScrollSettings(dtop);\n      FP.test.top = -dtop + 'px';\n      setState({\n        canScroll: false\n      });\n      scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function () {\n        setTimeout(function () {\n          setState({\n            isBeyondFullpage: true\n          });\n          setState({\n            canScroll: true\n          });\n        }, 30);\n      });\n    }\n    function onKeyDown() {\n      if (!isFullPageAbove()) {\n        return;\n      } else {\n        scrollUpToFullpage();\n      }\n    }\n    function scrollUpToFullpage() {\n      var scrollSettings = getScrollSettings(getLast(getState().sections).item.offsetTop);\n      setState({\n        canScroll: false\n      });\n      scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function () {\n        setState({\n          canScroll: true\n        });\n        setState({\n          isBeyondFullpage: false\n        });\n        setState({\n          isAboutToScrollToFullPage: false\n        });\n      });\n    }\n\n    function getDestinationOffset() {\n      if (!getOptions().css3) {\n        return getLast(getState().sections).item.offsetTop + getLast(getState().sections).item.offsetHeight;\n      }\n\n      return getScrollTop() + getWindowHeight();\n    }\n\n    function beyondFullPageHandler(container, e) {\n      new Date().getTime();\n      var pauseScroll = getState().isBeyondFullpage && container.getBoundingClientRect().bottom >= 0 && wheelDataHandler.getDirection() === 'up';\n      var g_isAboutToScrollToFullPage = getState().isAboutToScrollToFullPage;\n\n      if (g_isAboutToScrollToFullPage) {\n        preventDefault(e);\n        return false;\n      }\n\n      if (getState().isBeyondFullpage) {\n        if (!pauseScroll) {\n          keyframeTime('set', 'beyondFullpage', 1000);\n        } else {\n          var shouldSetFixedPosition = !g_isAboutToScrollToFullPage && (!keyframeTime('isNewKeyframe', 'beyondFullpage') || !wheelDataHandler.isAccelerating());\n          var scrollSettings;\n\n          if (shouldSetFixedPosition) {\n            scrollSettings = getScrollSettings(getLast(getState().sections).item.offsetTop + getLast(getState().sections).item.offsetHeight);\n            scrollSettings.element.scrollTo(0, scrollSettings.options);\n            setState({\n              isAboutToScrollToFullPage: false\n            });\n            preventDefault(e);\n            return false;\n          } else if (wheelDataHandler.isAccelerating()) {\n            pauseScroll = false;\n            setState({\n              isAboutToScrollToFullPage: true\n            });\n            setState({\n              scrollTrigger: 'wheel'\n            });\n            scrollUpToFullpage();\n            preventDefault(e);\n            return false;\n          }\n        }\n\n        if (!g_isAboutToScrollToFullPage) {\n          // allow normal scrolling, but quitting\n          if (!pauseScroll) {\n            return true;\n          }\n        }\n      }\n    }\n\n    var keyframeTime = function () {\n      var isNew = false;\n      var frames = {};\n      var timeframes = {};\n      return function (action, name, timeframe) {\n        switch (action) {\n          case 'set':\n            frames[name] = new Date().getTime();\n            timeframes[name] = timeframe;\n            break;\n\n          case 'isNewKeyframe':\n            var current = new Date().getTime();\n            isNew = current - frames[name] > timeframes[name];\n            break;\n        }\n\n        return isNew;\n      };\n    }();\n\n    FP.moveSectionDown = moveSectionDown;\n    /**\n    * Moves the page down one section.\n    */\n\n    function moveSectionDown() {\n      var next = getState().activeSection.next(); //looping to the top if there's no more sections below\n\n      if (!next && (getOptions().loopBottom || getOptions().continuousVertical)) {\n        next = getState().sections[0];\n      }\n\n      if (next != null) {\n        scrollPage(next, null, false);\n      } else if (hasContentBeyondFullPage()) {\n        EventEmitter.emit(events.scrollBeyondFullpage);\n      }\n    }\n\n    function hasContentBeyondFullPage() {\n      return getContainer().scrollHeight < $body.scrollHeight && getOptions().scrollBar && getOptions().scrollBeyondFullpage;\n    }\n\n    FP.moveSectionUp = moveSectionUp;\n    /**\n    * Moves the page up one section.\n    */\n\n    function moveSectionUp() {\n      var prev = getState().activeSection.prev(); //looping to the bottom if there's no more sections above\n\n      if (!prev && (getOptions().loopTop || getOptions().continuousVertical)) {\n        prev = getLast(getState().sections);\n      }\n\n      if (prev != null) {\n        scrollPage(prev, null, true);\n      }\n    }\n\n    var oldPageY = 0;\n    /**\n    * Detecting the direction of the mouse movement.\n    * Used only for the middle button of the mouse.\n    */\n\n    function mouseMoveHandler(e) {\n      if (!getOptions().autoScrolling) {\n        return;\n      }\n\n      if (state.canScroll) {\n        // moving up\n        if (e.pageY < oldPageY && getIsScrollAllowed().m.up) {\n          moveSectionUp();\n        } // moving down\n        else if (e.pageY > oldPageY && getIsScrollAllowed().m.down) {\n          moveSectionDown();\n        }\n      }\n\n      oldPageY = e.pageY;\n    }\n    function setOldPageY(value) {\n      oldPageY = value;\n    }\n\n    /**\n    * Determines the way of scrolling up or down:\n    * by 'automatically' scrolling a section or by using the default and normal scrolling.\n    */\n\n    function scrolling(type) {\n      if (!getIsScrollAllowed().m[type]) {\n        return;\n      }\n\n      var scrollSection = type === 'down' ? moveSectionDown : moveSectionUp;\n\n      if (getOptions().scrollOverflow && scrollOverflowHandler.isScrollable(getState().activeSection)) {\n        //is the scrollbar at the start/end of the scroll?\n        if (scrollOverflowHandler.isScrolled(type, getState().activeSection.item) && scrollOverflowHandler.shouldMovePage()) {\n          scrollSection();\n        }\n      } else {\n        scrollSection();\n      }\n    }\n\n    var touchStartY = 0;\n    var touchStartX = 0;\n    var touchEndY = 0;\n    var touchEndX = 0;\n    var MSPointer = getMSPointer();\n    var pointers = {\n      touchmove: 'ontouchmove' in window ? 'touchmove' : MSPointer ? MSPointer.move : null,\n      touchstart: 'ontouchstart' in window ? 'touchstart' : MSPointer ? MSPointer.down : null\n    };\n    /**\n    * Adds the possibility to auto scroll through sections on touch devices.\n    */\n\n    function addTouchHandler() {\n      if (!pointers.touchmove) {\n        return;\n      }\n\n      if (isTouchDevice || isTouch) {\n        if (getOptions().autoScrolling) {\n          $body.removeEventListener(pointers.touchmove, preventBouncing, {\n            passive: false\n          });\n          $body.addEventListener(pointers.touchmove, preventBouncing, {\n            passive: false\n          });\n        }\n\n        var touchWrapper = getOptions().touchWrapper;\n        touchWrapper.removeEventListener(pointers.touchstart, touchStartHandler);\n        touchWrapper.removeEventListener(pointers.touchmove, touchMoveHandler, {\n          passive: false\n        });\n        touchWrapper.addEventListener(pointers.touchstart, touchStartHandler);\n        touchWrapper.addEventListener(pointers.touchmove, touchMoveHandler, {\n          passive: false\n        });\n      }\n    }\n    /**\n    * Removes the auto scrolling for touch devices.\n    */\n\n    function removeTouchHandler() {\n      if (!pointers.touchmove) {\n        return;\n      }\n\n      if (isTouchDevice || isTouch) {\n        // normalScrollElements requires it off #2691\n        if (getOptions().autoScrolling) {\n          $body.removeEventListener(pointers.touchmove, touchMoveHandler, {\n            passive: false\n          });\n          $body.removeEventListener(pointers.touchmove, preventBouncing, {\n            passive: false\n          });\n        }\n\n        var touchWrapper = getOptions().touchWrapper;\n        touchWrapper.removeEventListener(pointers.touchstart, touchStartHandler);\n        touchWrapper.removeEventListener(pointers.touchmove, touchMoveHandler, {\n          passive: false\n        });\n      }\n    }\n    /* Detecting touch events\n\n    * As we are changing the top property of the page on scrolling, we can not use the traditional way to detect it.\n    * This way, the touchstart and the touch moves shows an small difference between them which is the\n    * used one to determine the direction.\n    */\n\n    function touchMoveHandler(e) {\n      var activeSection = closest(e.target, SECTION_SEL) || getState().activeSection.item;\n      var hasActiveSectionOverflow = scrollOverflowHandler.isScrollable(getState().activeSection);\n\n      if (isReallyTouch(e)) {\n        setState({\n          isGrabbing: true,\n          isUsingWheel: false\n        });\n\n        if (getOptions().autoScrolling) {\n          if (hasActiveSectionOverflow && !state.canScroll || getOptions().scrollBar) {\n            //preventing the easing on iOS devices\n            preventDefault(e);\n          }\n        }\n\n        var touchEvents = getEventsPage(e);\n        touchEndY = touchEvents.y;\n        touchEndX = touchEvents.x;\n        var isVerticalMovementEnough = Math.abs(touchStartY - touchEndY) > win.innerHeight / 100 * getOptions().touchSensitivity;\n        var isHorizontalMovementEnough = Math.abs(touchStartX - touchEndX) > getWindowWidth() / 100 * getOptions().touchSensitivity;\n        var isHorizontalPredominantMove = $(SLIDES_WRAPPER_SEL, activeSection).length && Math.abs(touchStartX - touchEndX) > Math.abs(touchStartY - touchEndY);\n        var directionH = touchStartX > touchEndX ? 'right' : 'left';\n        var directionV = touchStartY > touchEndY ? 'down' : 'up';\n        var direction = isHorizontalPredominantMove ? directionH : directionV;\n        setState({\n          touchDirection: direction\n        }); //if movement in the X axys is greater than in the Y and the currect section has slides...\n\n        if (isHorizontalPredominantMove) {\n          //is the movement greater than the minimum resistance to scroll?\n          if (!state.slideMoving && isHorizontalMovementEnough) {\n            if (touchStartX > touchEndX) {\n              if (getIsScrollAllowed().m.right) {\n                EventEmitter.emit(events.moveSlideRight, {\n                  section: activeSection\n                });\n              }\n            } else {\n              if (getIsScrollAllowed().m.left) {\n                EventEmitter.emit(events.moveSlideLeft, {\n                  section: activeSection\n                });\n              }\n            }\n          }\n        } //vertical scrolling (only when autoScrolling is enabled)\n        else if (getOptions().autoScrolling && state.canScroll) {\n          //is the movement greater than the minimum resistance to scroll?\n          if (isVerticalMovementEnough) {\n            scrolling(directionV);\n          }\n        }\n      }\n    }\n    /**\n    * As IE >= 10 fires both touch and mouse events when using a mouse in a touchscreen\n    * this way we make sure that is really a touch event what IE is detecting.\n    */\n\n\n    function isReallyTouch(e) {\n      //if is not IE   ||  IE is detecting `touch` or `pen`\n      return typeof e.pointerType === 'undefined' || e.pointerType != 'mouse';\n    }\n    /**\n    * Handler for the touch start event.\n    */\n\n\n    function touchStartHandler(e) {\n      //stopping the auto scroll to adjust to a section\n      if (getOptions().fitToSection) {\n        setState({\n          activeAnimation: false\n        });\n      }\n\n      if (isReallyTouch(e)) {\n        var touchEvents = getEventsPage(e);\n        touchStartY = touchEvents.y;\n        touchStartX = touchEvents.x;\n      }\n\n      windowAddEvent('touchend', touchEndHandler);\n    }\n    /**\n    * Handler for the touch end event.\n    */\n\n\n    function touchEndHandler() {\n      windowRemoveEvent('touchend', touchEndHandler);\n      setState({\n        isGrabbing: false\n      });\n    }\n    /**\n    * Gets the pageX and pageY properties depending on the browser.\n    * https://github.com/alvarotrigo/fullPage.js/issues/194#issuecomment-34069854\n    */\n\n\n    function getEventsPage(e) {\n      var events = {};\n      events.y = typeof e.pageY !== 'undefined' && (e.pageY || e.pageX) ? e.pageY : e.touches[0].pageY;\n      events.x = typeof e.pageX !== 'undefined' && (e.pageY || e.pageX) ? e.pageX : e.touches[0].pageX; //in touch devices with scrollBar:true, e.pageY is detected, but we have to deal with touch events. #1008\n\n      if (isTouch && isReallyTouch(e) && getOptions().scrollBar && typeof e.touches !== 'undefined') {\n        events.y = e.touches[0].pageY;\n        events.x = e.touches[0].pageX;\n      }\n\n      return events;\n    }\n    /*\n    * Returns and object with Microsoft pointers (for IE<11 and for IE >= 11)\n    * http://msdn.microsoft.com/en-us/library/ie/dn304886(v=vs.85).aspx\n    */\n\n\n    function getMSPointer() {\n      var pointer; //IE >= 11 & rest of browsers\n\n      if (win.PointerEvent) {\n        pointer = {\n          down: 'pointerdown',\n          move: 'pointermove'\n        };\n      }\n\n      return pointer;\n    }\n    /*\n    * Preventing bouncing in iOS #2285\n    */\n\n\n    function preventBouncing(e) {\n      if (getOptions().autoScrolling && isReallyTouch(e) && getIsScrollAllowed().m.up) {\n        //preventing the easing on iOS devices\n        if (!state.canScroll) {\n          preventDefault(e);\n        }\n      }\n    }\n\n    FP.moveSlideLeft = moveSlideLeft;\n    FP.moveSlideRight = moveSlideRight;\n    /**\n    * Slides a slider to the given direction.\n    * Optional `section` param.\n    */\n\n    function moveSlide(direction, section) {\n      var activeSectionItem = section == null ? getState().activeSection.item : section;\n      var activeSection = getPanelByElement(state.sections, activeSectionItem);\n      var slides = $(SLIDES_WRAPPER_SEL, activeSectionItem)[0]; // more than one slide needed and nothing should be sliding\n\n      if (slides == null || state.slideMoving || activeSection.slides.length < 2) {\n        return;\n      }\n\n      var currentSlide = activeSection.activeSlide;\n      var destiny = direction === 'left' ? currentSlide.prev() : currentSlide.next(); //isn't there a next slide in the secuence?\n\n      if (!destiny) {\n        //respect loopHorizontal setting\n        if (!getOptions().loopHorizontal) return;\n        destiny = direction === 'left' ? getLast(activeSection.slides) : activeSection.slides[0];\n      }\n\n      setState({\n        slideMoving: !FP.test.isTesting\n      });\n      landscapeScroll(slides, destiny.item, direction);\n    }\n    /**\n    * Slides left the slider of the active section.\n    * Optional `section` param.\n    */\n\n    function moveSlideLeft(section) {\n      moveSlide('left', section);\n    }\n    /**\n    * Slides right the slider of the active section.\n    * Optional `section` param.\n    */\n\n    function moveSlideRight(section) {\n      moveSlide('right', section);\n    }\n\n    /**\n    * Gets a section by its anchor / index\n    */\n\n    function getSectionByAnchor(sectionAnchor) {\n      var section = getState().sections.filter(function (section) {\n        return section.anchor === sectionAnchor;\n      })[0];\n\n      if (!section) {\n        var sectionIndex = typeof sectionAnchor !== 'undefined' ? sectionAnchor - 1 : 0;\n        section = getState().sections[sectionIndex];\n      }\n\n      return section;\n    }\n\n    /**\n    * Scrolls the slider to the given slide destination for the given section\n    */\n\n    function scrollSlider(slideElem) {\n      if (slideElem != null) {\n        landscapeScroll(closest(slideElem, SLIDES_WRAPPER_SEL), slideElem);\n      }\n    }\n\n    /**\n    * Scrolls to the given section and slide anchors\n    */\n\n    function scrollPageAndSlide(sectionAnchor, slideAnchor) {\n      var section = getSectionByAnchor(sectionAnchor); //do nothing if there's no section with the given anchor name\n\n      if (section == null) return;\n      var slideElem = getSlideByAnchor(slideAnchor, section); //we need to scroll to the section and then to the slide\n\n      if ((!section.anchor || section.anchor !== state.lastScrolledDestiny) && !hasClass(section.item, ACTIVE)) {\n        scrollPage(section, function () {\n          scrollSlider(slideElem);\n        });\n      } //if we were already in the section\n      else {\n        scrollSlider(slideElem);\n      }\n    }\n    /**\n    * Gets a slide inside a given section by its anchor / index\n    */\n\n    function getSlideByAnchor(slideAnchor, section) {\n      var slide = section.slides.filter(function (slide) {\n        return slide.anchor === slideAnchor;\n      })[0];\n\n      if (slide == null) {\n        slideAnchor = typeof slideAnchor !== 'undefined' ? slideAnchor : 0;\n        slide = section.slides[slideAnchor];\n      }\n\n      return slide ? slide.item : null;\n    }\n\n    FP.moveTo = moveTo$1;\n    /**\n    * Moves the page to the given section and slide.\n    * Anchors or index positions can be used as params.\n    */\n\n    function moveTo$1(sectionAnchor, slideAnchor) {\n      var destiny = getSectionByAnchor(sectionAnchor);\n\n      if (typeof slideAnchor !== 'undefined') {\n        scrollPageAndSlide(sectionAnchor, slideAnchor);\n      } else if (destiny != null) {\n        scrollPage(destiny);\n      }\n    }\n\n    //@ts-check\n    var g_controlPressed;\n    var g_keydownId;\n    var g_elToFocus;\n    EventEmitter.on(events.bindEvents, bindEvents$8);\n\n    function bindEvents$8() {\n      //when opening a new tab (ctrl + t), `control` won't be pressed when coming back.\n      windowAddEvent('blur', blurHandler); //Sliding with arrow keys, both, vertical and horizontal\n\n      docAddEvent('keydown', keydownHandler); //to prevent scrolling while zooming\n\n      docAddEvent('keyup', keyUpHandler);\n      EventEmitter.on(events.onDestroy, onDestroy$5);\n      EventEmitter.on(events.afterSlideLoads, onAfterSlideLoads);\n      EventEmitter.on(events.afterSectionLoads, afterSectionLoads);\n    }\n\n    function onDestroy$5() {\n      clearTimeout(g_keydownId);\n      docRemoveEvent('keydown', keydownHandler);\n      docRemoveEvent('keyup', keyUpHandler);\n    } //Sliding with arrow keys, both, vertical and horizontal\n\n\n    function keydownHandler(e) {\n      clearTimeout(g_keydownId);\n      var keyCode = e.keyCode;\n      var isPressingHorizontalArrows = [37, 39].indexOf(keyCode) > -1;\n      var canScrollWithKeyboard = getOptions().autoScrolling || getOptions().fitToSection || isPressingHorizontalArrows; //tab?\n\n      if (keyCode === 9) {\n        onTab(e);\n      } else if (!isInsideInput() && getOptions().keyboardScrolling && canScrollWithKeyboard) {\n        g_controlPressed = e.ctrlKey;\n        g_keydownId = setTimeout(function () {\n          onkeydown(e);\n        }, 0);\n      }\n    }\n    /**\n    * Keydown event\n    */\n\n\n    function onkeydown(e) {\n      var shiftPressed = e.shiftKey;\n      var activeElement = doc.activeElement;\n      var isMediaFocused = matches(activeElement, 'video') || matches(activeElement, 'audio');\n      var isScrolled = {\n        up: scrollOverflowHandler.isScrolled('up', getState().activeSection.item),\n        down: scrollOverflowHandler.isScrolled('down', getState().activeSection.item)\n      };\n      var isUsingHorizontalArrowKeys = [37, 39].indexOf(e.keyCode) > -1;\n      cancelDirectionKeyEvents(e); //do nothing if we can not scroll or we are not using horizotnal key arrows.\n\n      if (!state.canScroll && !isUsingHorizontalArrowKeys) {\n        return;\n      }\n\n      setState({\n        scrollTrigger: 'keydown'\n      });\n\n      switch (e.keyCode) {\n        //up\n        case 38:\n        case 33:\n          if (getIsScrollAllowed().k.up && isScrolled.up) {\n            if (state.isBeyondFullpage) {\n              EventEmitter.emit(events.onKeyDown, {\n                e: e\n              });\n            } else {\n              moveSectionUp();\n            }\n          } else {\n            scrollOverflowHandler.focusScrollable();\n          }\n\n          break;\n        //down\n\n        case 32:\n          //spacebar\n          if (shiftPressed && getIsScrollAllowed().k.up && !isMediaFocused && isScrolled.up) {\n            moveSectionUp();\n            break;\n          }\n\n        /* falls through */\n\n        case 40:\n        case 34:\n          if (getIsScrollAllowed().k.down && isScrolled.down) {\n            if (state.isBeyondFullpage) {\n              return;\n            } // space bar?\n\n\n            if (e.keyCode !== 32 || !isMediaFocused) {\n              moveSectionDown();\n            }\n          } else {\n            scrollOverflowHandler.focusScrollable();\n          }\n\n          break;\n        //Home\n\n        case 36:\n          if (getIsScrollAllowed().k.up) {\n            moveTo$1(1);\n          }\n\n          break;\n        //End\n\n        case 35:\n          if (getIsScrollAllowed().k.down) {\n            moveTo$1(getState().sections.length);\n          }\n\n          break;\n        //left\n\n        case 37:\n          if (getIsScrollAllowed().k.left) {\n            moveSlideLeft();\n          }\n\n          break;\n        //right\n\n        case 39:\n          if (getIsScrollAllowed().k.right) {\n            moveSlideRight();\n          }\n\n          break;\n\n        default:\n          return;\n        // exit this handler for other keys\n      }\n    } //to prevent scrolling while zooming\n\n\n    function keyUpHandler(e) {\n      if (state.isWindowFocused) {\n        //the keyup gets fired on new tab ctrl + t in Firefox\n        g_controlPressed = e.ctrlKey;\n      }\n    } //when opening a new tab (ctrl + t), `control` won't be pressed when coming back.\n\n\n    function blurHandler() {\n      setState({\n        isWindowFocused: false\n      });\n      g_controlPressed = false;\n    }\n    /**\n    * Makes sure the tab key will only focus elements within the current section/slide\n    * preventing this way from breaking the page.\n    * Based on \"Modals and keyboard traps\"\n    * from https://developers.google.com/web/fundamentals/accessibility/focus/using-tabindex\n    */\n\n\n    function onTab(e) {\n      var isShiftPressed = e.shiftKey;\n      var activeElement = doc.activeElement;\n      var focusableElements = getFocusables(getSlideOrSection(getState().activeSection.item));\n\n      function preventAndFocusFirst(e) {\n        preventDefault(e);\n        return focusableElements[0] ? focusableElements[0].focus() : null;\n      } // deactivating tab while scrolling #4550\n\n\n      if (!state.canScroll) {\n        preventDefault(e);\n        return;\n      } //outside any section or slide? Let's not hijack the tab!\n\n\n      if (isFocusOutside(e)) {\n        return;\n      } //is there an element with focus?\n\n\n      if (activeElement) {\n        if (closest(activeElement, SECTION_ACTIVE_SEL + ',' + SECTION_ACTIVE_SEL + ' ' + SLIDE_ACTIVE_SEL) == null) {\n          activeElement = preventAndFocusFirst(e);\n        }\n      } //no element if focused? Let's focus the first one of the section/slide\n      else {\n        preventAndFocusFirst(e);\n      } //when reached the first or last focusable element of the section/slide\n      //we prevent the tab action to keep it in the last focusable element\n\n\n      var isFirstFocusableInSection = activeElement == focusableElements[0];\n      var isLastFocusableInSection = activeElement == focusableElements[focusableElements.length - 1];\n      var isNextItem = !isShiftPressed && isLastFocusableInSection;\n      var isPrevItem = isShiftPressed && isFirstFocusableInSection;\n\n      if (isPrevItem || isNextItem) {\n        preventDefault(e);\n        var focusInfo = getPanelWithFocusable(isPrevItem);\n        var destinationPanel = focusInfo ? focusInfo.panel : null;\n\n        if (destinationPanel) {\n          var destinationSection = destinationPanel.isSection ? destinationPanel : destinationPanel.parent;\n          EventEmitter.emit(events.onScrollPageAndSlide, {\n            sectionAnchor: destinationSection.index() + 1,\n            slideAnchor: destinationPanel.isSection ? 0 : destinationPanel.index()\n          });\n          g_elToFocus = focusInfo.itemToFocus;\n          preventDefault(e);\n        }\n      }\n    }\n\n    function onAfterSlideLoads(v) {\n      focusItem();\n    }\n\n    function afterSectionLoads(v) {\n      if (!closest(g_elToFocus, SLIDE_SEL) || closest(g_elToFocus, SLIDE_ACTIVE_SEL)) {\n        focusItem();\n      }\n    }\n\n    function focusItem() {\n      if (g_elToFocus) {\n        g_elToFocus.focus();\n        g_elToFocus = null;\n      }\n    }\n    /**\n     * Get's the panel containing the element to focus.\n     *\n     */\n\n\n    function getPanelWithFocusable(isPrevItem) {\n      var action = isPrevItem ? 'prevPanel' : 'nextPanel';\n      var focusableElements = [];\n      var panelWithFocusables;\n      var currentPanel = getSlideOrSectionPanel(getActivePanel()[action]());\n\n      do {\n        focusableElements = getFocusables(currentPanel.item);\n\n        if (focusableElements.length) {\n          panelWithFocusables = {\n            panel: currentPanel,\n            itemToFocus: focusableElements[isPrevItem ? focusableElements.length - 1 : 0]\n          };\n        }\n\n        currentPanel = getSlideOrSectionPanel(currentPanel[action]());\n      } while (currentPanel && focusableElements.length === 0);\n\n      return panelWithFocusables;\n    }\n    /**\n    * Gets all the focusable elements inside the passed element.\n    */\n\n\n    function getFocusables(el) {\n      return [].slice.call($(focusableElementsString, el)).filter(function (item) {\n        return getAttr(item, 'tabindex') !== '-1' && //are also not hidden elements (or with hidden parents)\n        item.offsetParent !== null;\n      });\n    }\n    /**\n    * Determines whether the focus is outside fullpage.js sections/slides or not.\n    */\n\n\n    function isFocusOutside(e) {\n      var allFocusables = getFocusables(doc);\n      var currentFocusIndex = allFocusables.indexOf(doc.activeElement);\n      var focusDestinationIndex = e.shiftKey ? currentFocusIndex - 1 : currentFocusIndex + 1;\n      var focusDestination = allFocusables[focusDestinationIndex];\n      var destinationItemSlide = closest(focusDestination, SLIDE_SEL);\n      var destinationItemSection = closest(focusDestination, SECTION_SEL);\n      return !destinationItemSlide && !destinationItemSection;\n    }\n\n    function shouldCancelKeyboardNavigation(e) {\n      // https://keycode.info/for/34\n      // 40 = arrow down\n      // 38 = arrow up\n      // 32 = spacebar\n      // 33  = PageUp\n      // 34 = PageDown\n      var keyControls = [40, 38, 32, 33, 34];\n      return keyControls.indexOf(e.keyCode) > -1 && !state.isBeyondFullpage;\n    } //preventing the scroll with arrow keys & spacebar & Page Up & Down keys\n\n\n    function cancelDirectionKeyEvents(e) {\n      if (shouldCancelKeyboardNavigation(e) && !closest(e.target, OVERFLOW_SEL)) {\n        e.preventDefault();\n      }\n    }\n\n    function getControlPressed() {\n      return g_controlPressed;\n    }\n\n    var prevTime = new Date().getTime();\n    var scrollings = [];\n    FP.setMouseWheelScrolling = setMouseWheelScrolling;\n    /**\n    * Adds or remove the possibility of scrolling through sections by using the mouse wheel or the trackpad.\n    */\n\n    function setMouseWheelScrolling(value) {\n      if (value) {\n        addMouseWheelHandler();\n        addMiddleWheelHandler();\n      } else {\n        removeMouseWheelHandler();\n        removeMiddleWheelHandler();\n      }\n    }\n    /**\n    * Adds the auto scrolling action for the mouse wheel and trackpad.\n    * After this function is called, the mousewheel and trackpad movements will scroll through sections\n    * https://developer.mozilla.org/en-US/docs/Web/Events/wheel\n    */\n\n\n    function addMouseWheelHandler() {\n      var prefix = '';\n\n      var _addEventListener;\n\n      if (win.addEventListener) {\n        _addEventListener = \"addEventListener\";\n      } else {\n        _addEventListener = \"attachEvent\";\n        prefix = 'on';\n      } // detect available wheel event\n\n\n      var support = 'onwheel' in doc.createElement('div') ? 'wheel' : // Modern browsers support \"wheel\"\n      // @ts-ignore\n      doc.onmousewheel !== undefined ? 'mousewheel' : // Webkit and IE support at least \"mousewheel\"\n      'DOMMouseScroll'; // let's assume that remaining browsers are older Firefox\n\n      var passiveEvent = getPassiveOptionsIfPossible();\n\n      if (support == 'DOMMouseScroll') {\n        doc[_addEventListener](prefix + 'MozMousePixelScroll', MouseWheelHandler, passiveEvent);\n      } //handle MozMousePixelScroll in older Firefox\n      else {\n        doc[_addEventListener](prefix + support, MouseWheelHandler, passiveEvent);\n      }\n    }\n    /**\n    * Binding the mousemove when the mouse's middle button is pressed\n    */\n\n\n    function addMiddleWheelHandler() {\n      getContainer().addEventListener('mousedown', mouseDownHandler);\n      getContainer().addEventListener('mouseup', mouseUpHandler);\n    }\n    /**\n    * Removes the auto scrolling action fired by the mouse wheel and trackpad.\n    * After this function is called, the mousewheel and trackpad movements won't scroll through sections.\n    */\n\n\n    function removeMouseWheelHandler() {\n      if (doc.addEventListener) {\n        docRemoveEvent('mousewheel', MouseWheelHandler, false); //IE9, Chrome, Safari, Oper\n\n        docRemoveEvent('wheel', MouseWheelHandler, false); //Firefox\n\n        docRemoveEvent('MozMousePixelScroll', MouseWheelHandler, false); //old Firefox\n      } else {\n        // @ts-ignore\n        doc.detachEvent('onmousewheel', MouseWheelHandler); //IE 6/7/8\n      }\n    }\n    /**\n    * Unbinding the mousemove when the mouse's middle button is released\n    */\n\n\n    function removeMiddleWheelHandler() {\n      getContainer().removeEventListener('mousedown', mouseDownHandler);\n      getContainer().removeEventListener('mouseup', mouseUpHandler);\n    }\n    /**\n     * Detecting mousewheel scrolling\n     *\n     * http://blogs.sitepointstatic.com/examples/tech/mouse-wheel/index.html\n     * http://www.sitepoint.com/html5-javascript-mouse-wheel/\n     */\n\n\n    function MouseWheelHandler(e) {\n      var curTime = new Date().getTime();\n      var isNormalScroll = hasClass($(COMPLETELY_SEL)[0], NORMAL_SCROLL);\n      var isScrollAllowedBeyondFullPage = beyondFullPageHandler(getContainer(), e);\n\n      if (!state.isUsingWheel) {\n        setState({\n          isGrabbing: false,\n          isUsingWheel: true,\n          touchDirection: 'none'\n        });\n      } //is scroll allowed?\n\n\n      if (!getIsScrollAllowed().m.down && !getIsScrollAllowed().m.up) {\n        preventDefault(e);\n        return false;\n      }\n\n      if (isScrollAllowedBeyondFullPage) {\n        return true;\n      } else if (isScrollAllowedBeyondFullPage === false) {\n        preventDefault(e);\n        return false;\n      } //autoscrolling and not zooming?\n\n\n      if (getOptions().autoScrolling && !getControlPressed() && !isNormalScroll) {\n        // cross-browser wheel delta\n        e = e || win.event;\n        var value = e.wheelDelta || -e.deltaY || -e.detail;\n        var delta = Math.max(-1, Math.min(1, value));\n        var horizontalDetection = typeof e.wheelDeltaX !== 'undefined' || typeof e.deltaX !== 'undefined';\n        var isScrollingVertically = Math.abs(e.wheelDeltaX) < Math.abs(e.wheelDelta) || Math.abs(e.deltaX) < Math.abs(e.deltaY) || !horizontalDetection;\n        var direction = delta < 0 ? 'down' : delta > 0 ? 'up' : 'none'; //Limiting the array to 150 (lets not waste memory!)\n\n        if (scrollings.length > 149) {\n          scrollings.shift();\n        } //keeping record of the previous scrollings\n\n\n        scrollings.push(Math.abs(value)); //preventing to scroll the site on mouse wheel when scrollbar is present\n\n        if (getOptions().scrollBar) {\n          preventDefault(e);\n        } //time difference between the last scroll and the current one\n\n\n        var timeDiff = curTime - prevTime;\n        prevTime = curTime; //haven't they scrolled in a while?\n        //(enough to be consider a different scrolling action to scroll another section)\n\n        if (timeDiff > 200) {\n          //emptying the array, we dont care about old scrollings for our averages\n          scrollings = [];\n        }\n\n        setState({\n          wheelDirection: direction\n        });\n\n        if (state.canScroll) {\n          var averageEnd = getAverage(scrollings, 10);\n          var averageMiddle = getAverage(scrollings, 70);\n          var isAccelerating = averageEnd >= averageMiddle; //to avoid double swipes...\n\n          if (isAccelerating && isScrollingVertically) {\n            setState({\n              scrollTrigger: 'wheel'\n            }); //scrolling down?\n\n            if (delta < 0) {\n              scrolling('down');\n            } //scrolling up?\n            else {\n              scrolling('up');\n            }\n          }\n        }\n\n        return false;\n      }\n\n      if (getOptions().fitToSection) {\n        //stopping the auto scroll to adjust to a section\n        setState({\n          activeAnimation: false\n        });\n      }\n    } //binding the mousemove when the mouse's middle button is released\n\n\n    function mouseDownHandler(e) {\n      //middle button\n      if (e.which == 2) {\n        setOldPageY(e.pageY);\n        getContainer().addEventListener('mousemove', mouseMoveHandler);\n      }\n    } //unbinding the mousemove when the mouse's middle button is released\n\n\n    function mouseUpHandler(e) {\n      //middle button\n      if (e.which == 2) {\n        getContainer().removeEventListener('mousemove', mouseMoveHandler);\n      }\n    }\n    /**\n    * Adds or remove the mouse wheel hijacking\n    */\n\n\n    function setMouseHijack(value) {\n      if (value) {\n        setMouseWheelScrolling(true);\n        addTouchHandler();\n      } else {\n        setMouseWheelScrolling(false);\n        removeTouchHandler();\n      }\n    }\n\n    var g_canFireMouseEnterNormalScroll = true;\n    EventEmitter.on(events.bindEvents, bindEvents$7);\n\n    function bindEvents$7() {\n      /**\n      * Applying normalScroll elements.\n      * Ignoring the scrolls over the specified selectors.\n      */\n      if (getOptions().normalScrollElements) {\n        ['mouseenter', 'touchstart'].forEach(function (eventName) {\n          forMouseLeaveOrTouch(eventName, false);\n        });\n        ['mouseleave', 'touchend'].forEach(function (eventName) {\n          forMouseLeaveOrTouch(eventName, true);\n        });\n      }\n\n      EventEmitter.on(events.onDestroy, onDestroy$4);\n    }\n\n    function onDestroy$4() {\n      ['mouseenter', 'touchstart', 'mouseleave', 'touchend'].forEach(function (eventName) {\n        docRemoveEvent(eventName, onMouseEnterOrLeave, true); //true is required!\n      });\n    }\n\n    function forMouseLeaveOrTouch(eventName, allowScrolling) {\n      //a way to pass arguments to the onMouseEnterOrLeave function\n      document['fp_' + eventName] = allowScrolling;\n      docAddEvent(eventName, onMouseEnterOrLeave, true); //capturing phase\n    }\n\n    function onMouseEnterOrLeave(e) {\n      var type = e.type;\n      var isInsideOneNormalScroll = false; //onMouseLeave will use the destination target, not the one we are moving away from\n\n      var target = type === 'mouseleave' ? e.toElement || e.relatedTarget : e.target; //coming from closing a normalScrollElements modal or moving outside viewport?\n\n      if (target == document || !target) {\n        setMouseHijack(true);\n        return;\n      }\n\n      if (type === 'touchend') {\n        g_canFireMouseEnterNormalScroll = false;\n        setTimeout(function () {\n          g_canFireMouseEnterNormalScroll = true;\n        }, 800);\n      } //preventing mouseenter event to do anything when coming from a touchEnd event\n      //fixing issue #3576\n\n\n      if (type === 'mouseenter' && !g_canFireMouseEnterNormalScroll) {\n        return;\n      }\n\n      var normalSelectors = getOptions().normalScrollElements.split(',');\n      normalSelectors.forEach(function (normalSelector) {\n        if (!isInsideOneNormalScroll) {\n          var isNormalScrollTarget = matches(target, normalSelector); //leaving a child inside the normalScoll element is not leaving the normalScroll #3661\n\n          var isNormalScrollChildFocused = closest(target, normalSelector);\n\n          if (isNormalScrollTarget || isNormalScrollChildFocused) {\n            if (!FP.shared.isNormalScrollElement) {\n              setMouseHijack(false);\n            }\n\n            FP.shared.isNormalScrollElement = true;\n            isInsideOneNormalScroll = true;\n          }\n        }\n      }); //not inside a single normal scroll element anymore?\n\n      if (!isInsideOneNormalScroll && FP.shared.isNormalScrollElement) {\n        setMouseHijack(true);\n        FP.shared.isNormalScrollElement = false;\n      }\n    }\n\n    FP.silentMoveTo = silentMoveTo;\n    /**\n    * Moves the page to the given section and slide with no animation.\n    * Anchors or index positions can be used as params.\n    */\n\n    function silentMoveTo(sectionAnchor, slideAnchor) {\n      setScrollingSpeed(0, 'internal');\n      moveTo$1(sectionAnchor, slideAnchor);\n      setScrollingSpeed(getOriginals().scrollingSpeed, 'internal');\n    }\n\n    var previousHeight = getWindowHeight();\n    var windowsWidth = getWindowWidth();\n    var g_resizeId;\n    var g_isConsecutiveResize = false;\n    var g_resizeMobileHandlerId;\n    FP.reBuild = reBuild;\n    EventEmitter.on(events.bindEvents, bindEvents$6);\n\n    function bindEvents$6() {\n      // Setting VH correctly in mobile devices\n      resizeHandler(); //when resizing the site, we adjust the heights of the sections, slimScroll...\n\n      windowAddEvent('resize', resizeHandler);\n      EventEmitter.on(events.onDestroy, onDestroy$3);\n    }\n\n    function onDestroy$3() {\n      clearTimeout(g_resizeId);\n      clearTimeout(g_resizeMobileHandlerId);\n      windowRemoveEvent('resize', resizeHandler);\n    }\n    /*\n    * Resize event handler.\n    */\n\n\n    function resizeHandler() {\n      if (!g_isConsecutiveResize) {\n        if (getOptions().autoScrolling && !getOptions().scrollBar || !getOptions().fitToSection) {\n          setSectionsHeight(getWindowHeight());\n        }\n      }\n\n      fitToActiveSection();\n      g_isConsecutiveResize = true; //in order to call the functions only when the resize is finished\n      //http://stackoverflow.com/questions/4298612/jquery-how-to-call-resize-event-only-once-its-finished-resizing    \n\n      clearTimeout(g_resizeId);\n      g_resizeId = setTimeout(function () {\n        //issue #3336 \n        //(some apps or browsers, like Chrome/Firefox for Mobile take time to report the real height)\n        //so we check it 3 times with intervals in that case\n        // for(var i = 0; i< 4; i++){\n        resizeActions();\n        g_isConsecutiveResize = false; // }\n      }, 400);\n    }\n\n    function fitToActiveSection() {\n      if (isTouchDevice) {\n        // Issue #4393 and previously in v3, #3336\n        // (some apps or browsers, like Chrome/Firefox will delay a bit to scroll \n        // to the focused input\n        for (var i = 0; i < 4; i++) {\n          g_resizeMobileHandlerId = setTimeout(function () {\n            window.requestAnimationFrame(function () {\n              // on Android devices the browser scrolls to the focused element\n              // messing up the whole page structure. So we need to update the\n              // translate3d value when the keyboard shows/hides\n              if (getOptions().autoScrolling && !getOptions().scrollBar) {\n                setState({\n                  isResizing: true\n                });\n                silentMoveTo(state.activeSection.index() + 1);\n                setState({\n                  isResizing: false\n                });\n              }\n            });\n          }, 200 * i);\n        }\n      }\n    }\n    /**\n    * When resizing the site, we adjust the heights of the sections, slimScroll...\n    */\n\n\n    function resizeActions() {\n      setState({\n        isResizing: true\n      });\n      setSectionsHeight('');\n\n      if (!getOptions().autoScrolling && !state.isBeyondFullpage) {\n        setVhUnits();\n      }\n\n      EventEmitter.emit(events.contentChanged);\n      updateState(); //checking if it needs to get responsive\n\n      responsive(); // rebuild immediately on touch devices\n\n      if (isTouchDevice) {\n        var activeElement = doc.activeElement; //if the keyboard is NOT visible\n\n        if (!matches(activeElement, 'textarea') && !matches(activeElement, 'input') && !matches(activeElement, 'select')) {\n          var currentHeight = getWindowHeight(); //making sure the change in the viewport size is enough to force a rebuild. (20 % of the window to avoid problems when hidding scroll bars)\n\n          if (Math.abs(currentHeight - previousHeight) > 20 * Math.max(previousHeight, currentHeight) / 100) {\n            reBuild(true);\n            previousHeight = currentHeight;\n          }\n        }\n      } else {\n        adjustToNewViewport();\n      }\n\n      setState({\n        isResizing: false\n      });\n    }\n    /**\n     * When resizing is finished, we adjust the slides sizes and positions\n     */\n\n\n    function reBuild(resizing) {\n      if (hasClass(getContainer(), DESTROYED)) {\n        return;\n      } //nothing to do if the plugin was destroyed\n      //updating global vars\n\n\n      setState({\n        isResizing: true,\n        windowsHeight: getWindowHeight(),\n        windowsWidth: getWindowWidth()\n      });\n      var sections = getState().sections;\n\n      for (var i = 0; i < sections.length; ++i) {\n        var section = sections[i];\n        var slidesWrap = $(SLIDES_WRAPPER_SEL, section.item)[0];\n        var slides = section.slides; //adjusting the position fo the FULL WIDTH slides...\n\n        if (slides.length > 1) {\n          landscapeScroll(slidesWrap, section.activeSlide.item);\n        }\n      }\n\n      if (getOptions().scrollOverflow) {\n        scrollOverflowHandler.makeScrollable();\n      }\n\n      var sectionIndex = getState().activeSection.index();\n\n      if (!state.isBeyondFullpage) {\n        //isn't it the first section?\n        if (sectionIndex) {\n          //adjusting the position for the current section\n          silentMoveTo(sectionIndex + 1);\n        }\n      }\n\n      setState({\n        isResizing: false\n      });\n\n      if (isFunction(getOptions().afterResize) && resizing) {\n        getOptions().afterResize.call(getContainer(), win.innerWidth, win.innerHeight);\n      }\n\n      if (isFunction(getOptions().afterReBuild) && !resizing) {\n        getOptions().afterReBuild.call(getContainer());\n      }\n\n      trigger(getContainer(), 'afterRebuild');\n    }\n    /**\n    * Adjusts a section to the viewport if it has changed.\n    */\n\n\n    function adjustToNewViewport() {\n      var newWindowHeight = getWindowHeight();\n      var newWindowWidth = getWindowWidth();\n\n      if (state.windowsHeight !== newWindowHeight || windowsWidth !== newWindowWidth) {\n        setState({\n          windowsHeight: newWindowHeight\n        });\n        windowsWidth = newWindowWidth;\n        reBuild(true);\n      }\n    }\n\n    function setSectionsHeight(value) {\n      var propertyValue = value === '' ? '' : value + 'px';\n      getState().sections.forEach(function (section) {\n        css(section.item, {\n          'height': propertyValue\n        });\n      });\n    }\n    /**\n     * Defining the value in px of a VH unit. (Used for autoScrolling: false)\n     * To fix the height issue on mobile devices when using VH units.\n     * https://css-tricks.com/the-trick-to-viewport-units-on-mobile/\n     */\n\n\n    function setVhUnits() {\n      if (!getOptions().autoScrolling || getOptions().scrollBar) {\n        // First we get the viewport height and we multiple it by 1% to get a value for a vh unit\n        var vh = win.innerHeight * 0.01; // Then we set the value in the --vh custom property to the root of the document\n\n        doc.documentElement.style.setProperty('--vh', \"\".concat(vh, \"px\"));\n      }\n    }\n\n    function getAnchorsURL() {\n      var section;\n      var slide;\n      var hash = win.location.hash;\n\n      if (hash.length) {\n        //getting the anchor link in the URL and deleting the `#`\n        var anchorsParts = hash.replace('#', '').split('/'); //using / for visual reasons and not as a section/slide separator #2803\n\n        var isFunkyAnchor = hash.indexOf('#/') > -1;\n        section = isFunkyAnchor ? '/' + anchorsParts[1] : decodeURIComponent(anchorsParts[0]);\n        var slideAnchor = isFunkyAnchor ? anchorsParts[2] : anchorsParts[1];\n\n        if (slideAnchor && slideAnchor.length) {\n          slide = decodeURIComponent(slideAnchor);\n        }\n      }\n\n      return {\n        section: section,\n        slide: slide\n      };\n    }\n\n    FP.setLockAnchors = setLockAnchors;\n    EventEmitter.on(events.bindEvents, bindEvents$5);\n\n    function bindEvents$5() {\n      //detecting any change on the URL to scroll to the given anchor link\n      //(a way to detect back history button as we play with the hashes on the URL)\n      windowAddEvent('hashchange', hashChangeHandler);\n      EventEmitter.on(events.onDestroy, onDestroy$2);\n    }\n\n    function onDestroy$2() {\n      windowRemoveEvent('hashchange', hashChangeHandler);\n    }\n    /**\n    * Sets lockAnchors\n    */\n\n\n    function setLockAnchors(value) {\n      getOptions().lockAnchors = value;\n    }\n    /**\n    * Detecting any change on the URL to scroll to the given anchor link\n    * (a way to detect back history button as we play with the hashes on the URL)\n    */\n\n\n    function hashChangeHandler() {\n      if (!state.isScrolling && !getOptions().lockAnchors) {\n        var anchors = getAnchorsURL();\n        var sectionAnchor = anchors.section;\n        var slideAnchor = anchors.slide; //when moving to a slide in the first section for the first time (first time to add an anchor to the URL)\n\n        var isFirstSlideMove = typeof state.lastScrolledDestiny === 'undefined';\n        var isFirstScrollMove = typeof state.lastScrolledDestiny === 'undefined' && typeof slideAnchor === 'undefined' && !state.slideMoving;\n\n        if (sectionAnchor && sectionAnchor.length) {\n          /*in order to call scrollpage() only once for each destination at a time\n          It is called twice for each scroll otherwise, as in case of using anchorlinks `hashChange`\n          event is fired on every scroll too.*/\n          if (sectionAnchor && sectionAnchor !== state.lastScrolledDestiny && !isFirstSlideMove || isFirstScrollMove || !state.slideMoving && state.lastScrolledSlide != slideAnchor) {\n            EventEmitter.emit(events.onScrollPageAndSlide, {\n              sectionAnchor: sectionAnchor,\n              slideAnchor: slideAnchor\n            });\n          }\n        }\n      }\n    }\n\n    EventEmitter.on(events.bindEvents, bindEvents$4);\n\n    function bindEvents$4() {\n      docAddEvent('wheel', wheelDataHandler.registerEvent, getPassiveOptionsIfPossible());\n      EventEmitter.on(events.scrollBeyondFullpage, scrollBeyondFullPage);\n      EventEmitter.on(events.onKeyDown, onKeyDown);\n    }\n\n    EventEmitter.on(events.bindEvents, bindEvents$3);\n\n    function bindEvents$3() {\n      EventEmitter.on(events.onClickOrTouch, onClickOrTouch$1);\n    }\n\n    function onClickOrTouch$1(params) {\n      var target = params.target;\n\n      if (closest(target, getOptions().menu + ' [data-menuanchor]')) {\n        menuItemsHandler.call(target, params);\n      }\n    } //Menu item handler when not using anchors or using lockAnchors:true\n\n\n    function menuItemsHandler(e) {\n      setState({\n        scrollTrigger: 'menu'\n      });\n\n      if ($(getOptions().menu)[0] && (getOptions().lockAnchors || !getOptions().anchors.length)) {\n        preventDefault(e);\n        /*jshint validthis:true */\n\n        EventEmitter.emit(events.onMenuClick, {\n          anchor: getAttr(this, 'data-menuanchor')\n        });\n      }\n    }\n\n    EventEmitter.on(events.bindEvents, bindEvents$2);\n\n    function bindEvents$2() {\n      EventEmitter.on(events.onClickOrTouch, onClickOrTouch);\n    }\n\n    function onClickOrTouch(params) {\n      var target = params.target;\n\n      if (target && closest(target, SECTION_NAV_SEL + ' a')) {\n        sectionBulletHandler.call(target, params.e);\n      } else if (matches(target, SECTION_NAV_TOOLTIP_SEL)) {\n        tooltipTextHandler.call(target);\n      } else if (matches(target, SLIDES_NAV_LINK_SEL) || closest(target, SLIDES_NAV_LINK_SEL) != null) {\n        slideBulletHandler.call(target, params.e);\n      }\n    }\n\n    var lastScroll = 0;\n    var g_scrollId;\n    var g_scrollId2;\n    EventEmitter.on(events.onDestroy, onDestroy$1); //when scrolling...\n\n    function scrollHandler(e) {\n      var currentSection;\n      var currentSectionElem;\n\n      if (state.isResizing || !getState().activeSection) {\n        return;\n      }\n\n      getLast(getState().sections);\n\n      if (getState().isBeyondFullpage || getState().isAboutToScrollToFullPage) {\n        return;\n      }\n\n      if (!getOptions().autoScrolling || getOptions().scrollBar) {\n        var currentScroll = getScrollTop();\n        var scrollDirection = getScrollDirection(currentScroll);\n        var visibleSectionIndex = 0;\n        var screen_mid = currentScroll + getWindowHeight() / 2.0;\n        var isAtBottom = $body.scrollHeight - getWindowHeight() === currentScroll;\n        var sections = getState().sections;\n        setState({\n          scrollY: currentScroll\n        }); //when using `auto-height` for a small last section it won't be centered in the viewport\n\n        if (isAtBottom) {\n          visibleSectionIndex = sections.length - 1;\n        } //is at top? when using `auto-height` for a small first section it won't be centered in the viewport\n        else if (!currentScroll) {\n          visibleSectionIndex = 0;\n        } //taking the section which is showing more content in the viewport\n        else {\n          for (var i = 0; i < sections.length; ++i) {\n            var section = sections[i].item; // Pick the the last section which passes the middle line of the screen.\n\n            if (section.offsetTop <= screen_mid) {\n              visibleSectionIndex = i;\n            }\n          }\n        }\n\n        if (isCompletelyInViewPort(scrollDirection)) {\n          if (!hasClass(getState().activeSection.item, COMPLETELY)) {\n            addClass(getState().activeSection.item, COMPLETELY);\n            removeClass(siblings(getState().activeSection.item), COMPLETELY);\n          }\n        } //geting the last one, the current one on the screen\n\n\n        currentSection = sections[visibleSectionIndex];\n        currentSectionElem = currentSection.item; //setting the visible section as active when manually scrolling\n        //executing only once the first time we reach the section\n\n        if (!currentSection.isActive) {\n          setState({\n            isScrolling: true\n          });\n          var leavingSection = getState().activeSection.item;\n          var leavingSectionIndex = getState().activeSection.index() + 1;\n          var yMovement = getYmovement(getState().activeSection, currentSectionElem);\n          var anchorLink = currentSection.anchor;\n          var sectionIndex = currentSection.index() + 1;\n          var activeSlide = currentSection.activeSlide;\n          var slideIndex;\n          var slideAnchorLink;\n          var callbacksParams = {\n            activeSection: leavingSection,\n            sectionIndex: sectionIndex - 1,\n            anchorLink: anchorLink,\n            element: currentSectionElem,\n            leavingSection: leavingSectionIndex,\n            direction: yMovement,\n            items: {\n              origin: getState().activeSection,\n              destination: currentSection\n            }\n          };\n\n          if (activeSlide) {\n            slideAnchorLink = activeSlide.anchor;\n            slideIndex = activeSlide.index();\n          }\n\n          if (state.canScroll) {\n            addClass(currentSectionElem, ACTIVE);\n            removeClass(siblings(currentSectionElem), ACTIVE);\n\n            if (isFunction(getOptions().beforeLeave)) {\n              fireCallbackOncePerScroll('beforeLeave', callbacksParams);\n            }\n\n            if (isFunction(getOptions().onLeave)) {\n              fireCallback('onLeave', callbacksParams);\n            }\n\n            if (isFunction(getOptions().afterLoad)) {\n              fireCallback('afterLoad', callbacksParams);\n            }\n\n            stopMedia(leavingSection);\n            lazyLoad(currentSectionElem);\n            playMedia(currentSectionElem);\n            activateMenuAndNav(anchorLink, sectionIndex - 1);\n\n            if (getOptions().anchors.length) {\n              //needed to enter in hashChange event when using the menu with anchor links\n              setState({\n                lastScrolledDestiny: anchorLink\n              });\n            }\n\n            updateState();\n            setPageStatus(slideIndex, slideAnchorLink, anchorLink);\n          } //small timeout in order to avoid entering in hashChange event when scrolling is not finished yet\n\n\n          clearTimeout(g_scrollId);\n          g_scrollId = setTimeout(function () {\n            setState({\n              isScrolling: false\n            });\n          }, 100);\n        }\n\n        if (getOptions().fitToSection && state.canScroll) {\n          clearTimeout(g_scrollId2);\n          g_scrollId2 = setTimeout(function () {\n            var fixedSections = state.sections.filter(function (section) {\n              var sectionValues = section.item.getBoundingClientRect();\n              return Math.round(sectionValues.bottom) === Math.round(getWindowHeight()) || Math.round(sectionValues.top) === 0;\n            }); // No section is fitting the viewport? Let's fix that!\n\n            if (!fixedSections.length) {\n              fitToSection();\n            }\n          }, getOptions().fitToSectionDelay);\n        }\n      }\n    }\n\n    function onDestroy$1() {\n      clearTimeout(g_scrollId);\n      clearTimeout(g_scrollId2);\n    }\n    /**\n    * Gets the directon of the the scrolling fired by the scroll event.\n    */\n\n\n    function getScrollDirection(currentScroll) {\n      var direction = currentScroll > lastScroll ? 'down' : 'up';\n      lastScroll = currentScroll; //needed for auto-height sections to determine if we want to scroll to the top or bottom of the destination\n\n      setState({\n        previousDestTop: currentScroll\n      });\n      return direction;\n    }\n    /**\n    * Determines whether the active section has seen in its whole or not.\n    */\n\n\n    function isCompletelyInViewPort(movement) {\n      var top = getState().activeSection.item.offsetTop;\n      var bottom = top + getWindowHeight();\n\n      if (movement == 'up') {\n        return bottom >= getScrollTop() + getWindowHeight();\n      }\n\n      return top <= getScrollTop();\n    }\n\n    EventEmitter.on(events.bindEvents, bindEvents$1);\n    EventEmitter.on(events.onDestroy, onDestroy);\n\n    function onDestroy() {\n      windowRemoveEvent('scroll', scrollHandler);\n    }\n\n    function bindEvents$1() {\n      windowAddEvent('scroll', scrollHandler);\n      doc.body.addEventListener('scroll', scrollHandler);\n      EventEmitter.on(events.onScrollPageAndSlide, function (params) {\n        scrollPageAndSlide(params.sectionAnchor, params.slideAnchor);\n      });\n      EventEmitter.on(events.onMenuClick, function (params) {\n        moveTo$1(params.anchor, undefined);\n      });\n      EventEmitter.on(events.onScrollOverflowScrolled, function (params) {\n        var scrollSection = params.direction === 'down' ? moveSectionDown : moveSectionUp;\n        scrollSection();\n      });\n      EventEmitter.on(events.scrollPage, function (params) {\n        scrollPage(params.destination);\n      });\n    }\n\n    FP.getActiveSlide = getActiveSlide;\n\n    FP.getScrollX = function () {\n      return state.scrollX;\n    };\n\n    EventEmitter.on(events.bindEvents, bindEvents);\n\n    function bindEvents() {\n      EventEmitter.on(events.onDestroy, onDestroy$6);\n      EventEmitter.on(events.landscapeScroll, function (params) {\n        landscapeScroll(params.slides, params.destination);\n      });\n      EventEmitter.on(events.moveSlideRight, function (params) {\n        moveSlideRight(params.section);\n      });\n      EventEmitter.on(events.moveSlideLeft, function (params) {\n        moveSlideLeft(params.section);\n      });\n    }\n    /**\n    * Gets the active slide.\n    */\n\n\n    function getActiveSlide() {\n      return nullOrSlide(getState().activeSection.activeSlide);\n    }\n\n    EventEmitter.on(events.bindEvents, init$1);\n\n    function init$1() {\n      var position = getOptions().credits.position || 'right';\n      var positionStyle = ['left', 'right'].indexOf(position) > -1 ? \"\".concat(position, \": 0;\") : '';\n      var waterMark = \"\\n        <div class=\\\"fp-watermark\\\" style=\\\"\".concat(positionStyle, \"\\\">\\n            <a href=\\\"https://alvarotrigo.com/fullPage/\\\" \\n                rel=\\\"nofollow noopener\\\" \\n                target=\\\"_blank\\\" \\n                style=\\\"text-decoration:none; color: #000;\\\">\\n                    \").concat(getOptions().credits.label || 'Made with fullPage.js', \"\\n            </a>\\n        </div>\\n    \");\n      var lastSection = getLast(state.sections);\n      var shouldUseWaterMark = !state.isValid || getOptions().credits.enabled;\n\n      if (lastSection && lastSection.item && shouldUseWaterMark) {\n        lastSection.item.insertAdjacentHTML('beforeend', waterMark);\n      }\n    }\n\n    !function () {\n      EventEmitter.on(events.onInitialise, function () {\n        var n, a, l;\n        setState({\n          isValid: (getOptions().licenseKey, n = getOptions().licenseKey, a = function (n) {\n            var e = parseInt(\"\\x35\\x31\\x34\").toString(16);\n            if (!n || n.length < 29 || 4 === n.split(t[0]).length) return null;\n            var r = [\"\\x45\\x61\\x63\\x68\", \"\\x66\\x6f\\x72\"][i()]().join(\"\"),\n                a = n[[\"\\x73\\x70\\x6c\\x69\\x74\"]](\"-\"),\n                l = [];\n            a[r](function (t, n) {\n              if (n < 4) {\n                var r = function (t) {\n                  var n = t[t.length - 1],\n                      e = [\"\\x4e\\x61\\x4e\", \"\\x69\\x73\"][i()]().join(\"\");\n                  return window[e](n) ? o(n) : function (t) {\n                    return t - ACTIVE.length;\n                  }(n);\n                }(t);\n\n                l.push(r);\n                var s = o(t[r]);\n\n                if (1 === n) {\n                  var a = [\"\\x70\\x61\", \"\\x64\\x53\", \"\\x74\", \"\\x61\\x72\\x74\"].join(\"\");\n                  s = s.toString()[a](2, \"0\");\n                }\n\n                e += s, 0 !== n && 1 !== n || (e += \"-\");\n              }\n            });\n            var m = 0,\n                f = \"\";\n            return n.split(\"-\").forEach(function (t, n) {\n              if (n < 4) {\n                var _i = 0;\n\n                for (var e = 0; e < 4; e++) {\n                  e !== l[n] && (_i += Math.abs(o(t[e])), isNaN(t[e]) || m++);\n                }\n\n                var r = s(_i);\n                f += r;\n              }\n            }), f += s(m), {\n              v: new Date(e + \"T00:00\"),\n              o: e.split(\"-\")[2] === 8 * (ACTIVE.length - 2) + \"\",\n              l: f\n            };\n          }(n), l = function (t) {\n            var n = r[i()]().join(\"\");\n            return t && 0 === n.indexOf(t) && t.length === n.length;\n          }(n), (a || l) && (a && e <= a.v && a.l === n.split(t[0])[4] || l || a.o) || !1)\n        });\n      });\n      var t = [\"-\"];\n      var n = \"\\x32\\x30\\x32\\x33\\x2d\\x34\\x2d\\x32\\x39\".split(\"-\"),\n          e = new Date(n[0], n[1], n[2]),\n          r = [\"se\", \"licen\", \"-\", \"v3\", \"l\", \"gp\"];\n\n      function i() {\n        return [[\"\\x72\\x65\", \"\\x76\\x65\\x72\\x73\\x65\"].join(\"\")][\"\".length];\n      }\n\n      function o(t) {\n        return t ? isNaN(t) ? t.charCodeAt(0) - 72 : t : \"\";\n      }\n\n      function s(t) {\n        var n = 72 + t;\n        return n > 90 && n < 97 && (n += 15), String.fromCharCode(n).toUpperCase();\n      }\n    }();\n\n    //@ts-check\n    FP.setKeyboardScrolling = setKeyboardScrolling;\n    /**\n    * Adds or remove the possibility of scrolling through sections by using the keyboard arrow keys\n    */\n\n    function setKeyboardScrolling(value, directions) {\n      if (typeof directions !== 'undefined') {\n        directions = directions.replace(/ /g, '').split(',');\n        directions.forEach(function (direction) {\n          setIsScrollAllowed(value, direction, 'k');\n        });\n      } else {\n        setIsScrollAllowed(value, 'all', 'k');\n        getOptions().keyboardScrolling = value;\n      }\n    }\n\n    /**\n    * Sets the data-anchor attributes to the menu elements and activates the current one.\n    */\n\n    function styleMenu(section) {\n      var index = section.index();\n\n      if (typeof getOptions().anchors[index] !== 'undefined') {\n        //activating the menu / nav element on load\n        if (section.isActive) {\n          activateMenuAndNav(getOptions().anchors[index], index);\n        }\n      } //moving the menu outside the main container if it is inside (avoid problems with fixed positions when using CSS3 tranforms)\n\n\n      if (getOptions().menu && getOptions().css3 && closest($(getOptions().menu)[0], WRAPPER_SEL) != null) {\n        $(getOptions().menu).forEach(function (menu) {\n          $body.appendChild(menu);\n        });\n      }\n    }\n\n    /**\n    * Works over the DOM structure to set it up for the current fullpage getOptions().\n    */\n\n    function prepareDom() {\n      css(getParentsUntil(getContainer(), 'body'), {\n        'height': '100%',\n        'position': 'relative'\n      }); //adding a class to recognize the container internally in the code\n\n      addClass(getContainer(), WRAPPER);\n      addClass($html, ENABLED); //due to https://github.com/alvarotrigo/fullPage.js/issues/1502\n\n      setState({\n        windowsHeight: getWindowHeight()\n      });\n      removeClass(getContainer(), DESTROYED); //in case it was destroyed before initializing it again\n\n      addInternalSelectors();\n      var sections = getState().sectionsIncludingHidden; //styling the sections / slides / menu\n\n      for (var i = 0; i < sections.length; i++) {\n        var section = sections[i];\n        var slides = section.allSlidesItems; //caching the original styles to add them back on destroy('all')\n\n        var originalStyles = getAttr(section.item, 'style');\n\n        if (originalStyles) {\n          section.item.setAttribute('data-fp-styles', originalStyles);\n        }\n\n        styleSection(section);\n        styleMenu(section); // if there's any slide\n\n        if (slides.length > 0) {\n          styleSlides(section);\n        }\n      } //fixed elements need to be moved out of the plugin container due to problems with CSS3.\n\n\n      if (getOptions().fixedElements && getOptions().css3) {\n        $(getOptions().fixedElements).forEach(function (item) {\n          $body.appendChild(item);\n        });\n      } //vertical centered of the navigation + active bullet\n\n\n      if (getOptions().navigation) {\n        addVerticalNavigation();\n      }\n\n      enableYoutubeAPI();\n\n      if (getOptions().scrollOverflow) {\n        scrollOverflowHandler.makeScrollable();\n      }\n    }\n\n    FP.shared.afterRenderActions = afterRenderActions;\n    /**\n    * Actions and callbacks to fire afterRender\n    */\n\n    function afterRenderActions() {\n      var section = getState().activeSection;\n      var sectionElem = getState().activeSection.item;\n      addClass(sectionElem, COMPLETELY);\n      lazyLoad(sectionElem);\n      lazyLoadOthers();\n      playMedia(sectionElem);\n\n      if (isDestinyTheStartingSection() && isFunction(getOptions().afterLoad)) {\n        fireCallback('afterLoad', {\n          activeSection: sectionElem,\n          element: sectionElem,\n          direction: null,\n          //for backwards compatibility callback (to be removed in a future!)\n          anchorLink: section.anchor,\n          sectionIndex: section.index(),\n          items: {\n            origin: getState().activeSection,\n            destination: getState().activeSection\n          }\n        });\n      }\n\n      if (isFunction(getOptions().afterRender)) {\n        fireCallback('afterRender');\n      }\n    }\n    /**\n    * Determines if the URL anchor destiny is the starting section (the one using 'active' class before initialization)\n    */\n\n    function isDestinyTheStartingSection() {\n      var anchor = getAnchorsURL();\n      var destinationSection = getSectionByAnchor(anchor.section);\n      return !anchor.section || !destinationSection || typeof destinationSection !== 'undefined' && destinationSection.index() === index(getStartingSection());\n    }\n\n    FP.setAllowScrolling = setAllowScrolling;\n    /**\n    * Adds or remove the possibility of scrolling through sections by using the mouse wheel/trackpad or touch gestures.\n    * Optionally a second parameter can be used to specify the direction for which the action will be applied.\n    *\n    * @param directions string containing the direction or directions separated by comma.\n    */\n\n    function setAllowScrolling(value, directions) {\n      if (typeof directions !== 'undefined') {\n        directions = directions.replace(/ /g, '').split(',');\n        directions.forEach(function (direction) {\n          setIsScrollAllowed(value, direction, 'm');\n        });\n      } else {\n        setIsScrollAllowed(value, 'all', 'm');\n      }\n    }\n\n    /**\n    * Scrolls to the anchor in the URL when loading the site\n    */\n\n    function scrollToAnchor() {\n      var anchors = getAnchorsURL();\n      var sectionAnchor = anchors.section;\n      var slideAnchor = anchors.slide;\n\n      if (sectionAnchor) {\n        //if theres any #\n        if (getOptions().animateAnchor) {\n          scrollPageAndSlide(sectionAnchor, slideAnchor);\n        } else {\n          silentMoveTo(sectionAnchor, slideAnchor);\n        }\n      } else {\n        EventEmitter.emit(events.onAfterRenderNoAnchor, null);\n      }\n    }\n\n    /*\n    * Removes inline styles added by fullpage.js\n    */\n\n    function destroyStructure() {\n      //reseting the `top` or `translate` properties to 0\n      silentScroll(0); //loading all the lazy load content\n\n      $('img[data-src], source[data-src], audio[data-src], iframe[data-src]', getContainer()).forEach(function (item) {\n        setSrc(item, 'src');\n      });\n      $('img[data-srcset]').forEach(function (item) {\n        setSrc(item, 'srcset');\n      });\n      remove($(SECTION_NAV_SEL + ', ' + SLIDES_NAV_SEL + ', ' + SLIDES_ARROW_SEL)); //removing inline styles\n\n      css(getNodes(getState().sections), {\n        'height': '',\n        'background-color': '',\n        'padding': ''\n      });\n      css(getNodes(getState().slides), {\n        'width': ''\n      });\n      css(getContainer(), {\n        'height': '',\n        'position': '',\n        '-ms-touch-action': '',\n        'touch-action': ''\n      });\n      css($htmlBody, {\n        'overflow': '',\n        'height': ''\n      }); // remove .fp-enabled class\n\n      removeClass($html, ENABLED); // remove .fp-responsive class & .fp-scrollable\n\n      removeClass($body, RESPONSIVE + ' ' + SCROLLABLE); // remove all of the .fp-viewing- classes\n\n      $body.className.split(/\\s+/).forEach(function (className) {\n        if (className.indexOf(VIEWING_PREFIX) === 0) {\n          removeClass($body, className);\n        }\n      }); //removing added classes\n\n      getNodes(getState().panels).forEach(function (item) {\n        if (getOptions().scrollOverflow) {\n          scrollOverflowHandler.destroyWrapper(item);\n        }\n\n        removeClass(item, TABLE + ' ' + ACTIVE + ' ' + COMPLETELY + ' ' + IS_OVERFLOW);\n        var previousStyles = getAttr(item, 'data-fp-styles');\n\n        if (previousStyles) {\n          item.setAttribute('style', previousStyles);\n        } //removing anchors if they were not set using the HTML markup\n\n\n        if (hasClass(item, SECTION) && !getInitialAnchorsInDom()) {\n          item.removeAttribute('data-anchor');\n        }\n      }); //removing the applied transition from the fullpage wrapper\n\n      removeAnimation(getContainer()); //Unwrapping content\n\n      [TABLE_CELL_SEL, SLIDES_CONTAINER_SEL, SLIDES_WRAPPER_SEL].forEach(function (selector) {\n        $(selector, getContainer()).forEach(function (item) {\n          //unwrap not being use in case there's no child element inside and its just text\n          unwrap(item);\n        });\n      }); //removing the applied transition from the fullpage wrapper\n\n      css(getContainer(), {\n        '-webkit-transition': 'none',\n        'transition': 'none'\n      });\n      removeClass(getContainer(), WRAPPER); //scrolling the page to the top with no animation\n\n      win.scrollTo(0, 0); //removing selectors\n\n      var usedSelectors = [SECTION, SLIDE, SLIDES_CONTAINER];\n      usedSelectors.forEach(function (item) {\n        removeClass($('.' + item), item);\n      });\n    }\n\n    FP.destroy = destroy;\n    function init() {\n      updateStructuralState();\n      updateState();\n      getOptions().scrollBar = getOptions().scrollBar || getOptions().hybrid;\n      setOptionsFromDOM();\n      prepareDom();\n      setAllowScrolling(true);\n      setMouseHijack(true);\n      setAutoScrolling(getOptions().autoScrolling, 'internal');\n      responsive(); //setting the class for the body element\n\n      setBodyClass();\n\n      if (doc.readyState === 'complete') {\n        scrollToAnchor();\n      }\n\n      windowAddEvent('load', scrollToAnchor);\n      afterRenderActions(); // Updating the state again with the new DOM\n\n      updateStructuralState();\n      updateState();\n    }\n    /*\n    * Destroys fullpage.js plugin events and optinally its html markup and styles\n    */\n\n    function destroy(all) {\n      setAutoScrolling(false, 'internal');\n      setAllowScrolling(true);\n      setMouseHijack(false);\n      setKeyboardScrolling(false);\n      addClass(getContainer(), DESTROYED);\n      EventEmitter.emit(events.onDestroy); //lets make a mess!\n\n      if (all) {\n        destroyStructure();\n      }\n    }\n\n    var isOK = function isOK() {\n      return getOptions() && state.isValid || doc.domain.indexOf('al' + 'varotri' + 'go' + '.' + 'com') > -1;\n    };\n    /**\n    * Displays warnings\n    */\n\n\n    function displayWarnings() {\n      var l = getOptions()['li' + 'c' + 'enseK' + 'e' + 'y'];\n      var msgStyle = 'font-size: 15px;background:yellow;';\n\n      if (getOptions().licenseKey.trim() === '') {\n        showError('error', 'Fullpage.js requires a `licenseKey` option. Read about it on the following URL:');\n        showError('error', 'https://github.com/alvarotrigo/fullPage.js#options');\n      } else if (!isOK()) {\n        showError('error', 'Incorrect `licenseKey`. Get one for fullPage.js version 4 here:');\n        showError('error', 'https://alvarotrigo.com/fullPage/pricing');\n      } else if (l && l.length < 20) {\n        console.warn('%c This website was made using fullPage.js slider. More info on the following website:', msgStyle);\n        console.warn('%c https://alvarotrigo.com/fullPage/', msgStyle);\n      }\n\n      if (hasClass($html, ENABLED)) {\n        showError('error', 'Fullpage.js can only be initialized once and you are doing it multiple times!');\n        return;\n      } // Disable mutually exclusive settings\n\n\n      if (getOptions().continuousVertical && (getOptions().loopTop || getOptions().loopBottom)) {\n        getOptions().continuousVertical = false;\n        showError('warn', 'Option `loopTop/loopBottom` is mutually exclusive with `continuousVertical`; `continuousVertical` disabled');\n      }\n\n      if (getOptions().scrollOverflow && (getOptions().scrollBar || !getOptions().autoScrolling)) {\n        showError('warn', 'Options scrollBar:true and autoScrolling:false are mutually exclusive with scrollOverflow:true. Sections with scrollOverflow might not work well in Firefox');\n      }\n\n      if (getOptions().continuousVertical && (getOptions().scrollBar || !getOptions().autoScrolling)) {\n        getOptions().continuousVertical = false;\n        showError('warn', 'Scroll bars (`scrollBar:true` or `autoScrolling:false`) are mutually exclusive with `continuousVertical`; `continuousVertical` disabled');\n      } //using extensions? Wrong file!\n\n\n      extensions.forEach(function (extension) {\n        //is the option set to true?\n        if (getOptions()[extension]) {\n          showError('warn', 'fullpage.js extensions require fullpage.extensions.min.js file instead of the usual fullpage.js. Requested: ' + extension);\n        }\n      }); //anchors can not have the same value as any element ID or NAME\n\n      getOptions().anchors.forEach(function (name) {\n        //case insensitive selectors (http://stackoverflow.com/a/19465187/1081396)\n        var nameAttr = [].slice.call($('[name]')).filter(function (item) {\n          return getAttr(item, 'name') && getAttr(item, 'name').toLowerCase() == name.toLowerCase();\n        });\n        var idAttr = [].slice.call($('[id]')).filter(function (item) {\n          return getAttr(item, 'id') && getAttr(item, 'id').toLowerCase() == name.toLowerCase();\n        });\n\n        if (idAttr.length || nameAttr.length) {\n          showError('error', 'data-anchor tags can not have the same value as any `id` element on the site (or `name` element for IE).');\n          var propertyName = idAttr.length ? 'id' : 'name';\n\n          if (idAttr.length || nameAttr.length) {\n            showError('error', '\"' + name + '\" is is being used by another element `' + propertyName + '` property');\n          }\n        }\n      });\n    }\n\n    function fullpage(containerSelector, options) {\n      setCache(); //only once my friend!\n\n      if (hasClass($html, ENABLED)) {\n        displayWarnings();\n        return;\n      }\n\n      setOption('touchWrapper', typeof containerSelector === 'string' ? $(containerSelector)[0] : containerSelector); // Creating some defaults, extending them with any options that were provided\n\n      setOptions(options);\n      setContainer(typeof containerSelector === 'string' ? $(containerSelector)[0] : containerSelector);\n      EventEmitter.emit(events.onInitialise);\n      displayWarnings();\n      setAPI();\n\n      if (getContainer()) {\n        EventEmitter.emit(events.beforeInit);\n        init();\n        EventEmitter.emit(events.bindEvents);\n      } // @ts-ignore\n\n\n      return win.fullpage_api;\n    }\n\n    function setAPI() {\n      FP.getFullpageData = function () {\n        return {\n          options: getOptions()\n        };\n      }; //public functions\n\n\n      FP.version = '4.0.20';\n      FP.test = Object.assign(FP.test, {\n        top: '0px',\n        translate3d: 'translate3d(0px, 0px, 0px)',\n        translate3dH: function () {\n          var a = [];\n\n          for (var i = 0; i < $(getOptions().sectionSelector, getContainer()).length; i++) {\n            a.push('translate3d(0px, 0px, 0px)');\n          }\n\n          return a;\n        }(),\n        left: function () {\n          var a = [];\n\n          for (var i = 0; i < $(getOptions().sectionSelector, getContainer()).length; i++) {\n            a.push(0);\n          }\n\n          return a;\n        }(),\n        options: getOptions(),\n        setAutoScrolling: null\n      }); //functions we want to share across files but which are not\n      //mean to be used on their own by developers\n\n      FP.shared = Object.assign(FP.shared, {\n        afterRenderActions: null,\n        isNormalScrollElement: false\n      }); // @ts-ignore\n\n      win.fullpage_api = FP;\n    }\n\n    // @ts-ignore\n\n    win.fp_easings = deepExtend(win.fp_easings, {\n      easeInOutCubic: function easeInOutCubic(t, b, c, d) {\n        if ((t /= d / 2) < 1) return c / 2 * t * t * t + b;\n        return c / 2 * ((t -= 2) * t * t + 2) + b;\n      }\n    });\n\n    /**\n     * jQuery adapter for fullPage.js 3.0.0\n     */\n    // @ts-ignore\n\n    if (win.jQuery) {\n      (function ($, fullpage) {\n\n        if (!$ || !fullpage) {\n          showError('error', 'jQuery is required to use the jQuery fullpage adapter!');\n          return;\n        }\n\n        $.fn.fullpage = function (options) {\n          options = $.extend({}, options, {\n            '$': $\n          });\n          new fullpage(this[0], options); // Creating the $.fn.fullpage object\n\n          Object.keys(FP).forEach(function (key) {\n            getOptions().$.fn.fullpage[key] = FP[key];\n          });\n        }; // @ts-ignore\n\n      })(win.jQuery, fullpage);\n    }\n\n    return fullpage;\n\n}));\n\n},{}],2:[function(require,module,exports){\n// Optional. When using fullPage extensions\n//require('./fullpage.scrollHorizontally.min');\n\n// Optional. When using scrollOverflow:true\n//require('fullpage.js/vendors/scrolloverflow');\n\nvar fullpage = require('fullpage.js');\n\n// When using fullPage extensions replace the previos require\n// of fullpage.js for this file\n//var fullpage = require('fullpage.js/dist/fullpage.extensions.min');\n\n// Initializing it\nvar fullPageInstance = new fullpage('#myFullpage', {\n    navigation: true,\n    sectionsColor:['#ff5f45', '#0798ec', '#fc6c7c', 'grey']\n});\n\n// Calling methods\n// fullpage_api.moveSectionDown();\n// Or\n// fullPageInstance.moveSectionDown();\n},{\"fullpage.js\":1}]},{},[2]);\n"
  },
  {
    "path": "examples/module_loaders/browserify-example/package.json",
    "content": "{\n  \"name\": \"browserify-example\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"dist/index.html\",\n  \"scripts\": {\n    \"build\": \"browserify src/index.js > dist/main.js\"\n  },\n  \"author\": \"\",\n  \"license\": \"GPLv3\",\n  \"dependencies\": {\n    \"browserify\": \"^16.2.2\",\n    \"fullpage.js\": \"^4.0.21\"\n  }\n}\n"
  },
  {
    "path": "examples/module_loaders/browserify-example/src/index.js",
    "content": "// Optional. When using fullPage extensions\n//require('./fullpage.scrollHorizontally.min');\n\n// Optional. When using scrollOverflow:true\n//require('fullpage.js/vendors/scrolloverflow');\n\nvar fullpage = require('fullpage.js');\n\n// When using fullPage extensions replace the previos require\n// of fullpage.js for this file\n//var fullpage = require('fullpage.js/dist/fullpage.extensions.min');\n\n// Initializing it\nvar fullPageInstance = new fullpage('#myFullpage', {\n    navigation: true,\n    sectionsColor:['#ff5f45', '#0798ec', '#fc6c7c', 'grey']\n});\n\n// Calling methods\n// fullpage_api.moveSectionDown();\n// Or\n// fullPageInstance.moveSectionDown();"
  },
  {
    "path": "examples/module_loaders/requirejs-example/README.md",
    "content": "# Require.js example for fullpage.js\n\n### Require.js configuration\n\n```javascript\n// src/require.config.js\nvar require = {\n    baseUrl: \".\",\n    app: \"./\",\n    paths: {\n        \"fullpage\": \"./node_modules/fullpage.js/dist/fullpage\",\n        \"IScroll\": \"./node_modules/fullpage.js/vendors/scrolloverflow\",\n        \"fullpageExtensions\": \"./node_modules/fullpage.js/dist/fullpage.extensions.min\",\n\n        /*\n        When using any fullPage extensions you'll have to add the path to the\n        extension file here\n        */\n        //\"scrollHorizontally\": \"./src/fullpage.scrollHorizontally.min\"\n    }\n};\n```\n\n### HTML file\n\n```html\n<!-- index.html  -->\n<script src=\"src/require.config.js\"></script>\n<script data-main=\"src/main\" type=\"text/javascript\" src=\"https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.5/require.min.js\"></script>\n```\n\n### Main file\n\nDepending on your fullPage.js options, use one of the following defines:\n\n```javascript\n// src/main.js\ndefine(['fullpage'], function(fullpage) {\n\n    // Initializing it\n    var fullPageInstance = new fullpage('#myFullpage', {\n        navigation: true,\n        sectionsColor:['#ff5f45', '#0798ec', '#fc6c7c', 'grey']\n    });\n});\n```\n\nIf you want to use the fullPage.js option `scrollOverflow:true`:\n\n```javascript\n// src/main.js\ndefine(['IScroll', 'fullpage'], function(IScroll, fullpage) {\n\n    // Initializing it\n    var fullPageInstance = new fullpage('#myFullpage', {\n        navigation: true,\n        sectionsColor:['blue', 'red', 'purple', 'grey'],\n        scrollOverflow: true\n    });\n});\n```\n\nIf you want to use any extension, like `scrollHorizontally` as well as `scrollOverflow:true`:\n\n```javascript\n// src/main.js\ndefine(['IScroll', 'scrollHorizontally', 'fullpageExtensions'], function(IScroll, scrollHorizontally, fullpage) {\n\n    // Initializing it\n    var fullPageInstance = new fullpage('#myFullpage', {\n        navigation: true,\n        sectionsColor:['blue', 'red', 'purple', 'grey'],\n        scrollOverflow: true,\n        scrollHorizontally: true\n    });\n});\n```\n"
  },
  {
    "path": "examples/module_loaders/requirejs-example/index.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>Require.js example for fullPage.js</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"./node_modules/fullpage.js/dist/fullpage.min.css\" />\n    <style type=\"text/css\">\n        .section{\n            font-size: 3.5em;\n            font-family: arial;\n            color: #fff;\n            text-align: center;\n        }\n    </style>\n  </head>\n  <body>\n\n    <div id=\"myFullpage\">\n        <div class=\"section\">Section 1</div>\n        <div class=\"section\">\n            <div class=\"slide\">Slide 2.1</div>\n            <div class=\"slide\">Slide 2.2</div>\n            <div class=\"slide\">Slide 2.3</div>\n        </div>\n        <div class=\"section\">Section 3</div>\n    </div>\n\n    <script src=\"src/require.config.js\"></script>\n    <script data-main=\"src/main\" type=\"text/javascript\" src=\"https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.5/require.min.js\"></script>\n  </body>\n</html>"
  },
  {
    "path": "examples/module_loaders/requirejs-example/package.json",
    "content": "{\n  \"name\": \"requirejs-example\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"GPLv3\",\n  \"dependencies\": {\n    \"fullpage.js\": \"^4.0.21\"\n  }\n}\n"
  },
  {
    "path": "examples/module_loaders/requirejs-example/src/main.js",
    "content": "define(['fullpage'], function(fullpage) {\n\n    // Initializing it\n    var fullPageInstance = new fullpage('#myFullpage', {\n        navigation: true,\n        sectionsColor:['#ff5f45', '#0798ec', '#fc6c7c', 'grey']\n    });\n});\n\n\n// Example using scrollOverflow\n/*\ndefine(['IScroll', 'fullpage'], function(IScroll, fullpage) {\n\n    // Initializing it\n    var fullPageInstance = new fullpage('#myFullpage', {\n        navigation: true,\n        sectionsColor:['blue', 'red', 'purple', 'grey'],\n        scrollOverflow: true\n    });\n});\n*/\n\n\n// Example using scrollOverflow and scrollHorizontally extension\n/*\ndefine(['IScroll', 'scrollHorizontally', 'fullpageExtensions'], function(IScroll, scrollHorizontally, fullpage) {\n\n    // Initializing it\n    var fullPageInstance = new fullpage('#myFullpage', {\n        navigation: true,\n        sectionsColor:['blue', 'red', 'purple', 'grey'],\n        scrollOverflow: true,\n        scrollHorizontally: true\n    });\n});\n*/\n"
  },
  {
    "path": "examples/module_loaders/requirejs-example/src/require.config.js",
    "content": "var require = {\n    baseUrl: \".\",\n    app: \"./\",\n    paths: {\n        \"fullpage\": \"./node_modules/fullpage.js/dist/fullpage\",\n        \"IScroll\": \"./node_modules/fullpage.js/vendors/scrolloverflow\",\n        \"fullpageExtensions\": \"./node_modules/fullpage.js/dist/fullpage.extensions.min\",\n\n        /*\n        When using any fullPage extensions you'll have to add the path to the\n        extension file here\n        */\n        //\"scrollHorizontally\": \"./src/fullpage.scrollHorizontally.min\"\n    }\n};\n"
  },
  {
    "path": "examples/module_loaders/webpack-example/.babelrc",
    "content": "{\n    \"presets\": [\n        [\n            \"env\", {}\n        ]\n    ]\n}"
  },
  {
    "path": "examples/module_loaders/webpack-example/README.md",
    "content": "# Webpack example for fullPage.js\n\n### Creating the bundle file\n\nIn order to create the bundle file `main.js` run the following command inside the root folder:\n\n```sh\nnpm install\n```\n\nThen run:\n```sh\nnpm run build\n```\n\nWhich runs the comand specified in `package.json`:\n\n```sh\nnpx webpack --config webpack.config.js\n```\n\n### Importing files\n\n```javascript\n// Optional. When using fullPage extensions\n//import scrollHorizontally from './fullpage.scrollHorizontally.min';\n\n// Optional. When using scrollOverflow:true\n//import IScroll from 'fullpage.js/vendors/scrolloverflow';\n\n// Importing fullpage.js\nimport fullpage from 'fullpage.js';\n\n// When using fullPage extensions replace the previous import\n// of fullpage.js for this file\n//import fullpage from 'fullpage.js/dist/fullpage.extensions.min';\n\n// Initializing it\nvar fullPageInstance = new fullpage('#myFullpage', {\n    navigation: true,\n    sectionsColor:['#ff5f45', '#0798ec', '#fc6c7c', 'grey']\n});\n```\n"
  },
  {
    "path": "examples/module_loaders/webpack-example/dist/index.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>Webpack example for fullPage.js</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../node_modules/fullpage.js/dist/fullpage.min.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../node_modules/fullpage.js/dist/fullpage.min.css\" />\n    <style type=\"text/css\">\n        .section{\n            font-size: 3.5em;\n            font-family: arial;\n            color: #fff;\n            text-align: center;\n        }\n    </style>\n  </head>\n  <body>\n\n    <div id=\"myFullpage\">\n        <div class=\"section\">Section 1</div>\n        <div class=\"section\">\n            <div class=\"slide\">Slide 2.1</div>\n            <div class=\"slide\">Slide 2.2</div>\n            <div class=\"slide\">Slide 2.3</div>\n        </div>\n        <div class=\"section\">Section 3</div>\n    </div>\n\n    <script src=\"main.js\"></script>\n  </body>\n</html>"
  },
  {
    "path": "examples/module_loaders/webpack-example/dist/main.js",
    "content": "/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = \"./src/index.js\");\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"./node_modules/fullpage.js/dist/fullpage.js\":\n/*!***************************************************!*\\\n  !*** ./node_modules/fullpage.js/dist/fullpage.js ***!\n  \\***************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*!\n* fullPage 4.0.20\n* https://github.com/alvarotrigo/fullPage.js\n*\n* @license GPLv3 for open source use only\n* or Fullpage Commercial License for commercial use\n* http://alvarotrigo.com/fullPage/pricing/\n*\n* Copyright (C) 2018 http://alvarotrigo.com/fullPage - A project by Alvaro Trigo\n*/\n\n(function (global, factory) {\n     true ? module.exports = factory() :\n    undefined;\n})(this, (function () { 'use strict';\n\n    // https://tc39.github.io/ecma262/#sec-array.prototype.find\n    if (!Array.prototype.find) {\n      Object.defineProperty(Array.prototype, 'find', {\n        value: function value(predicate) {\n          // 1. Let O be ? ToObject(this value).\n          if (this == null) {\n            throw new TypeError('\"this\" is null or not defined');\n          }\n\n          var o = Object(this); // 2. Let len be ? ToLength(? Get(O, \"length\")).\n\n          var len = o.length >>> 0; // 3. If IsCallable(predicate) is false, throw a TypeError exception.\n\n          if (typeof predicate !== 'function') {\n            throw new TypeError('predicate must be a function');\n          } // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.\n\n\n          var thisArg = arguments[1]; // 5. Let k be 0.\n\n          var k = 0; // 6. Repeat, while k < len\n\n          while (k < len) {\n            // a. Let Pk be ! ToString(k).\n            // b. Let kValue be ? Get(O, Pk).\n            // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).\n            // d. If testResult is true, return kValue.\n            var kValue = o[k];\n\n            if (predicate.call(thisArg, kValue, k, o)) {\n              return kValue;\n            } // e. Increase k by 1.\n\n\n            k++;\n          } // 7. Return undefined.\n\n\n          return undefined;\n        }\n      });\n    }\n\n    // Production steps of ECMA-262, Edition 6, 22.1.2.1\n    if (!Array.from) {\n      Array.from = function () {\n        var toStr = Object.prototype.toString;\n\n        var isCallable = function isCallable(fn) {\n          return typeof fn === 'function' || toStr.call(fn) === '[object Function]';\n        };\n\n        var toInteger = function toInteger(value) {\n          var number = Number(value);\n\n          if (isNaN(number)) {\n            return 0;\n          }\n\n          if (number === 0 || !isFinite(number)) {\n            return number;\n          }\n\n          return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));\n        };\n\n        var maxSafeInteger = Math.pow(2, 53) - 1;\n\n        var toLength = function toLength(value) {\n          var len = toInteger(value);\n          return Math.min(Math.max(len, 0), maxSafeInteger);\n        }; // The length property of the from method is 1.\n\n\n        return function from(arrayLike\n        /*, mapFn, thisArg */\n        ) {\n          // 1. Let C be the this value.\n          var C = this; // 2. Let items be ToObject(arrayLike).\n\n          var items = Object(arrayLike); // 3. ReturnIfAbrupt(items).\n\n          if (arrayLike == null) {\n            throw new TypeError('Array.from requires an array-like object - not null or undefined');\n          } // 4. If mapfn is undefined, then let mapping be false.\n\n\n          var mapFn = arguments.length > 1 ? arguments[1] : void undefined;\n          var T;\n\n          if (typeof mapFn !== 'undefined') {\n            // 5. else\n            // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.\n            if (!isCallable(mapFn)) {\n              throw new TypeError('Array.from: when provided, the second argument must be a function');\n            } // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.\n\n\n            if (arguments.length > 2) {\n              T = arguments[2];\n            }\n          } // 10. Let lenValue be Get(items, \"length\").\n          // 11. Let len be ToLength(lenValue).\n\n\n          var len = toLength(items.length); // 13. If IsConstructor(C) is true, then\n          // 13. a. Let A be the result of calling the [[Construct]] internal method\n          // of C with an argument list containing the single item len.\n          // 14. a. Else, Let A be ArrayCreate(len).\n\n          var A = isCallable(C) ? Object(new C(len)) : new Array(len); // 16. Let k be 0.\n\n          var k = 0; // 17. Repeat, while k < len… (also steps a - h)\n\n          var kValue;\n\n          while (k < len) {\n            kValue = items[k];\n\n            if (mapFn) {\n              A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);\n            } else {\n              A[k] = kValue;\n            }\n\n            k += 1;\n          } // 18. Let putStatus be Put(A, \"length\", len, true).\n\n\n          A.length = len; // 20. Return A.\n\n          return A;\n        };\n      }();\n    }\n\n    var win = window;\n    var doc = document;\n    var isTouchDevice = navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/);\n    var isMacDevice = /(Mac|iPhone|iPod|iPad)/i.test(win.navigator.userAgent); // @ts-ignore\n\n    var isTouch = 'ontouchstart' in win || navigator.msMaxTouchPoints > 0 || navigator.maxTouchPoints;\n    var isIE11 = !!window.MSInputMethodContext && !!document.documentMode; // taken from https://github.com/udacity/ud891/blob/gh-pages/lesson2-focus/07-modals-and-keyboard-traps/solution/modal.js\n\n    var focusableElementsString = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex=\"0\"], [contenteditable]'; // cache common elements\n\n    var FP = {\n      test: {},\n      shared: {}\n    };\n    var extensions = ['parallax', 'scrollOverflowReset', 'dragAndMove', 'offsetSections', 'fadingEffect', 'responsiveSlides', 'continuousHorizontal', 'interlockedSlides', 'scrollHorizontally', 'resetSliders', 'cards', 'dropEffect', 'waterEffect'];\n\n    /**\n    * forEach polyfill for IE\n    * https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach#Browser_Compatibility\n    */\n\n    if (win.NodeList && !NodeList.prototype.forEach) {\n      NodeList.prototype.forEach = function (callback, thisArg) {\n        thisArg = thisArg || window;\n\n        for (var i = 0; i < this.length; i++) {\n          callback.call(thisArg, this[i], i, this);\n        }\n      };\n    }\n\n    if (typeof Object.assign != 'function') {\n      // Must be writable: true, enumerable: false, configurable: true\n      Object.defineProperty(Object, 'assign', {\n        value: function assign(target, varArgs) {\n\n          if (target == null) {\n            // TypeError if undefined or null\n            throw new TypeError('Cannot convert undefined or null to object');\n          }\n\n          var to = Object(target);\n\n          for (var index = 1; index < arguments.length; index++) {\n            var nextSource = arguments[index];\n\n            if (nextSource != null) {\n              // Skip over if undefined or null\n              for (var nextKey in nextSource) {\n                // Avoid bugs when hasOwnProperty is shadowed\n                if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n                  to[nextKey] = nextSource[nextKey];\n                }\n              }\n            }\n          }\n\n          return to;\n        },\n        writable: true,\n        configurable: true\n      });\n    }\n\n    // https://stackoverflow.com/questions/51719553/padstart-not-working-in-ie11\n    // https://github.com/behnammodi/polyfill/blob/master/string.polyfill.js\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart\n    if (!String.prototype.padStart) {\n      String.prototype.padStart = function padStart(targetLength, padString) {\n        targetLength = targetLength >> 0; //truncate if number or convert non-number to 0;\n\n        padString = String(typeof padString !== 'undefined' ? padString : ' ');\n\n        if (this.length > targetLength) {\n          return String(this);\n        } else {\n          targetLength = targetLength - this.length;\n\n          if (targetLength > padString.length) {\n            padString += Array.apply(null, Array(targetLength)).map(function () {\n              return padString;\n            }).join(\"\");\n          }\n\n          return padString.slice(0, targetLength) + String(this);\n        }\n      };\n    }\n\n    //utils\n    /**\n    * Shows a message in the console of the given type.\n    */\n\n    function showError(type, text) {\n      win.console && win.console[type] && win.console[type]('fullPage: ' + text);\n    }\n    function isVisible(el) {\n      var style = win.getComputedStyle(el);\n      return style.display !== 'none';\n    }\n    function getVisible(elements) {\n      return Array.from(elements).filter(function (e) {\n        return isVisible(e);\n      });\n    }\n    /**\n    * Equivalent of jQuery function $().\n    */\n\n    function $(selector, context) {\n      context = arguments.length > 1 ? context : document;\n      return context ? context.querySelectorAll(selector) : null;\n    }\n    /**\n    * Extends a given Object properties and its childs.\n    */\n\n    function deepExtend(out) {\n      out = out || {};\n\n      for (var i = 1, len = arguments.length; i < len; ++i) {\n        var obj = arguments[i];\n\n        if (!obj) {\n          continue;\n        }\n\n        for (var key in obj) {\n          if (!obj.hasOwnProperty(key) || key == '__proto__' || key == 'constructor') {\n            continue;\n          } // based on https://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/\n\n\n          if (Object.prototype.toString.call(obj[key]) === '[object Object]') {\n            out[key] = deepExtend(out[key], obj[key]);\n            continue;\n          }\n\n          out[key] = obj[key];\n        }\n      }\n\n      return out;\n    }\n    /**\n    * Checks if the passed element contains the passed class.\n    */\n\n    function hasClass(el, className) {\n      if (el == null) {\n        return false;\n      }\n\n      return el.classList.contains(className);\n    }\n    /**\n    * Gets the window height. Crossbrowser.\n    */\n\n    function getWindowHeight() {\n      return 'innerHeight' in win ? win.innerHeight : doc.documentElement.offsetHeight;\n    }\n    /**\n    * Gets the window width.\n    */\n\n    function getWindowWidth() {\n      return win.innerWidth;\n    }\n    /**\n    * Set's the CSS properties for the passed item/s.\n    * @param {NodeList|HTMLElement|Object} items\n    * @param {Object} props css properties and values.\n    */\n\n    function css(items, props) {\n      items = getList(items);\n      var key;\n\n      for (key in props) {\n        if (props.hasOwnProperty(key)) {\n          if (key !== null) {\n            for (var i = 0; i < items.length; i++) {\n              var item = items[i];\n              item.style[key] = props[key];\n            }\n          }\n        }\n      }\n\n      return items;\n    }\n    /**\n    * Gets the previous element to the passed element.\n    */\n\n    function prev(item) {\n      return item.previousElementSibling;\n    }\n    /**\n    * Gets the next element to the passed element.\n    */\n\n    function next(item) {\n      return item.nextElementSibling;\n    }\n    /**\n    * Gets the last element from the passed list of elements.\n    */\n\n    function last(item) {\n      return item[item.length - 1];\n    }\n    /**\n    * Gets index from the passed element.\n    * @param {String} selector is optional.\n    */\n\n    function index(item, selector) {\n      item = isArrayOrList(item) ? item[0] : item;\n      var children = selector != null ? $(selector, item.parentNode) : item.parentNode.childNodes;\n      var num = 0;\n\n      for (var i = 0; i < children.length; i++) {\n        if (children[i] == item) return num;\n        if (children[i].nodeType == 1) num++;\n      }\n\n      return -1;\n    }\n    /**\n    * Gets an iterable element for the passed element/s\n    */\n\n    function getList(item) {\n      return !isArrayOrList(item) ? [item] : item;\n    }\n    /**\n    * Adds the display=none property for the passed element/s\n    */\n\n    function hide(el) {\n      el = getList(el);\n\n      for (var i = 0; i < el.length; i++) {\n        el[i].style.display = 'none';\n      }\n\n      return el;\n    }\n    /**\n    * Adds the display=block property for the passed element/s\n    */\n\n    function show(el) {\n      el = getList(el);\n\n      for (var i = 0; i < el.length; i++) {\n        el[i].style.display = 'block';\n      }\n\n      return el;\n    }\n    /**\n    * Checks if the passed element is an iterable element or not\n    */\n\n    function isArrayOrList(el) {\n      return Object.prototype.toString.call(el) === '[object Array]' || Object.prototype.toString.call(el) === '[object NodeList]';\n    }\n    /**\n    * Adds the passed class to the passed element/s\n    */\n\n    function addClass(el, className) {\n      el = getList(el);\n\n      for (var i = 0; i < el.length; i++) {\n        var item = el[i];\n        item.classList.add(className);\n      }\n\n      return el;\n    }\n    /**\n    * Removes the passed class to the passed element/s\n    * @param {String} `className` can be multiple classnames separated by whitespace\n    */\n\n    function removeClass(el, className) {\n      el = getList(el);\n      var classNames = className.split(' ');\n\n      for (var a = 0; a < classNames.length; a++) {\n        className = classNames[a];\n\n        for (var i = 0; i < el.length; i++) {\n          var item = el[i];\n          item.classList.remove(className);\n        }\n      }\n\n      return el;\n    }\n    /**\n    * Appends the given element ot the given parent.\n    */\n\n    function appendTo(el, parent) {\n      parent.appendChild(el);\n    }\n    /**\n    Usage:\n\n    var wrapper = document.createElement('div');\n    wrapper.className = 'fp-slides';\n    wrap($('.slide'), wrapper);\n\n    https://jsfiddle.net/qwzc7oy3/15/ (vanilla)\n    https://jsfiddle.net/oya6ndka/1/ (jquery equivalent)\n    */\n\n    function wrap(toWrap, wrapper, isWrapAll) {\n      var newParent;\n      wrapper = wrapper || doc.createElement('div');\n\n      for (var i = 0; i < toWrap.length; i++) {\n        var item = toWrap[i];\n\n        if (isWrapAll && !i || !isWrapAll) {\n          newParent = wrapper.cloneNode(true);\n          item.parentNode.insertBefore(newParent, item);\n        }\n\n        newParent.appendChild(item);\n      }\n\n      return toWrap;\n    }\n    /**\n    Usage:\n    var wrapper = document.createElement('div');\n    wrapper.className = 'fp-slides';\n    wrap($('.slide'), wrapper);\n\n    https://jsfiddle.net/qwzc7oy3/27/ (vanilla)\n    https://jsfiddle.net/oya6ndka/4/ (jquery equivalent)\n    */\n\n    function wrapAll(toWrap, wrapper) {\n      wrap(toWrap, wrapper, true);\n    }\n    /**\n    * Usage:\n    * wrapInner(document.querySelector('#pepe'), '<div class=\"test\">afdas</div>');\n    * wrapInner(document.querySelector('#pepe'), element);\n    *\n    * https://jsfiddle.net/zexxz0tw/6/\n    *\n    * https://stackoverflow.com/a/21817590/1081396\n    */\n\n    function wrapInner(parent, wrapper) {\n      parent.appendChild(wrapper);\n\n      while (parent.firstChild !== wrapper) {\n        wrapper.appendChild(parent.firstChild);\n      }\n    }\n    /**\n    * Usage:\n    * unwrap(document.querySelector('#pepe'));\n    * unwrap(element);\n    *\n    * https://jsfiddle.net/szjt0hxq/1/\n    *\n    */\n\n    function unwrap(wrapper) {\n      var wrapperContent = doc.createDocumentFragment();\n\n      while (wrapper.firstChild) {\n        wrapperContent.appendChild(wrapper.firstChild);\n      }\n\n      wrapper.parentNode.replaceChild(wrapperContent, wrapper);\n    }\n    /**\n    * http://stackoverflow.com/questions/22100853/dom-pure-javascript-solution-to-jquery-closest-implementation\n    * Returns the element or `false` if there's none\n    */\n\n    function closest(el, selector) {\n      if (el && el.nodeType === 1) {\n        if (matches(el, selector)) {\n          return el;\n        }\n\n        return closest(el.parentNode, selector);\n      }\n\n      return null;\n    }\n    /**\n    * Places one element (rel) after another one or group of them (reference).\n    * @param {HTMLElement} reference\n    * @param {HTMLElement|NodeList|String|Array} el\n    * https://jsfiddle.net/9s97hhzv/1/\n    */\n\n    function after(reference, el) {\n      insertBefore(reference, reference.nextSibling, el);\n    }\n    /**\n    * Places one element (rel) before another one or group of them (reference).\n    * @param {HTMLElement} reference\n    * @param {HTMLElement|NodeList|String|Array} el\n    * https://jsfiddle.net/9s97hhzv/1/\n    */\n\n    function before(reference, el) {\n      insertBefore(reference, reference, el);\n    }\n    /**\n    * Based in https://stackoverflow.com/a/19316024/1081396\n    * and https://stackoverflow.com/a/4793630/1081396\n    */\n\n    function insertBefore(reference, beforeElement, el) {\n      if (!isArrayOrList(el)) {\n        if (typeof el == 'string') {\n          el = createElementFromHTML(el);\n        }\n\n        el = [el];\n      }\n\n      for (var i = 0; i < el.length; i++) {\n        reference.parentNode.insertBefore(el[i], beforeElement);\n      }\n    } //http://stackoverflow.com/questions/3464876/javascript-get-window-x-y-position-for-scroll\n\n    function getScrollTop() {\n      var docElement = doc.documentElement;\n      return (win.pageYOffset || docElement.scrollTop) - (docElement.clientTop || 0);\n    }\n    /**\n    * Gets the siblings of the passed element\n    */\n\n    function siblings(el) {\n      return Array.prototype.filter.call(el.parentNode.children, function (child) {\n        return child !== el;\n      });\n    }\n    function preventDefault(event) {\n      event.preventDefault();\n    }\n    function getAttr(el, attr) {\n      return el.getAttribute(attr);\n    }\n    function docAddEvent(event, callback, options) {\n      doc.addEventListener(event, callback, options === 'undefined' ? null : options);\n    }\n    function windowAddEvent(event, callback, options) {\n      win.addEventListener(event, callback, options === 'undefined' ? null : options);\n    }\n    function docRemoveEvent(event, callback, options) {\n      doc.removeEventListener(event, callback, options === 'undefined' ? null : options);\n    }\n    function windowRemoveEvent(event, callback, options) {\n      win.removeEventListener(event, callback, options === 'undefined' ? null : options);\n    }\n    /**\n    * Determines whether the passed item is of function type.\n    */\n\n    function isFunction(item) {\n      if (typeof item === 'function') {\n        return true;\n      }\n\n      var type = Object.prototype.toString.call(item);\n      return type === '[object Function]' || type === '[object GeneratorFunction]';\n    }\n    /**\n    * Trigger custom events\n    */\n\n    function trigger(el, eventName, data) {\n      var event;\n      data = typeof data === 'undefined' ? {} : data; // Native\n\n      if (typeof win.CustomEvent === \"function\") {\n        event = new CustomEvent(eventName, {\n          detail: data\n        });\n      } else {\n        event = doc.createEvent('CustomEvent');\n        event.initCustomEvent(eventName, true, true, data);\n      }\n\n      el.dispatchEvent(event);\n    }\n    /**\n    * Polyfill of .matches()\n    */\n\n    function matches(el, selector) {\n      return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector);\n    }\n    /**\n    * Toggles the visibility of the passed element el.\n    */\n\n    function toggle(el, value) {\n      if (typeof value === \"boolean\") {\n        for (var i = 0; i < el.length; i++) {\n          el[i].style.display = value ? 'block' : 'none';\n        }\n      } //we don't use it in other way, so no else :)\n\n\n      return el;\n    }\n    /**\n    * Creates a HTMLElement from the passed HTML string.\n    * https://stackoverflow.com/a/494348/1081396\n    */\n\n    function createElementFromHTML(htmlString) {\n      var div = doc.createElement('div');\n      div.innerHTML = htmlString.trim(); // Change this to div.childNodes to support multiple top-level nodes\n\n      return div.firstChild;\n    }\n    /**\n    * Removes the passed item/s from the DOM.\n    */\n\n    function remove(items) {\n      items = getList(items);\n\n      for (var i = 0; i < items.length; i++) {\n        var item = items[i];\n\n        if (item && item.parentElement) {\n          item.parentNode.removeChild(item);\n        }\n      }\n    } //https://jsfiddle.net/w1rktecz/\n\n    function untilAll(item, selector, fn) {\n      var sibling = item[fn];\n      var siblings = [];\n\n      while (sibling) {\n        if (matches(sibling, selector) || selector == null) {\n          siblings.push(sibling);\n        }\n\n        sibling = sibling[fn];\n      }\n\n      return siblings;\n    }\n    /**\n    * Gets all next elements matching the passed selector.\n    */\n\n    function nextAll(item, selector) {\n      return untilAll(item, selector, 'nextElementSibling');\n    }\n    /**\n    * Gets all previous elements matching the passed selector.\n    */\n\n    function prevAll(item, selector) {\n      return untilAll(item, selector, 'previousElementSibling');\n    }\n    /**\n    * Converts an object to an array.\n    */\n\n    function toArray(objectData) {\n      return Object.keys(objectData).map(function (key) {\n        return objectData[key];\n      });\n    }\n    function getLast(items) {\n      return items[items.length - 1];\n    }\n    /**\n    * Gets the average of the last `number` elements of the given array.\n    */\n\n    function getAverage(elements, number) {\n      var sum = 0; //taking `number` elements from the end to make the average, if there are not enought, 1\n\n      var lastElements = elements.slice(Math.max(elements.length - number, 1));\n\n      for (var i = 0; i < lastElements.length; i++) {\n        sum = sum + lastElements[i];\n      }\n\n      return Math.ceil(sum / number);\n    }\n    /**\n    * Sets the value for the given attribute from the `data-` attribute with the same suffix\n    * ie: data-srcset ==> srcset  |  data-src ==> src\n    */\n\n    function setSrc(element, attribute) {\n      element.setAttribute(attribute, getAttr(element, 'data-' + attribute));\n      element.removeAttribute('data-' + attribute);\n    }\n    function getParentsUntil(item, topParentSelector) {\n      var parents = [item];\n\n      do {\n        item = item.parentNode;\n        parents.push(item);\n      } while (!matches(item, topParentSelector));\n\n      return parents;\n    }\n    function isInsideInput() {\n      var activeElement = doc.activeElement;\n      return matches(activeElement, 'textarea') || matches(activeElement, 'input') || matches(activeElement, 'select') || getAttr(activeElement, 'contentEditable') == \"true\" || getAttr(activeElement, 'contentEditable') == '';\n    } //utils are public, so we can use it wherever we want\n    // @ts-ignore\n\n    window[\"fp_utils\"] = {\n      \"$\": $,\n      \"deepExtend\": deepExtend,\n      \"hasClass\": hasClass,\n      \"getWindowHeight\": getWindowHeight,\n      \"css\": css,\n      \"prev\": prev,\n      \"next\": next,\n      \"last\": last,\n      \"index\": index,\n      \"getList\": getList,\n      \"hide\": hide,\n      \"show\": show,\n      \"isArrayOrList\": isArrayOrList,\n      \"addClass\": addClass,\n      \"removeClass\": removeClass,\n      \"appendTo\": appendTo,\n      \"wrap\": wrap,\n      \"wrapAll\": wrapAll,\n      \"unwrap\": unwrap,\n      \"closest\": closest,\n      \"after\": after,\n      \"before\": before,\n      \"insertBefore\": insertBefore,\n      \"getScrollTop\": getScrollTop,\n      \"siblings\": siblings,\n      \"preventDefault\": preventDefault,\n      \"isFunction\": isFunction,\n      \"trigger\": trigger,\n      \"matches\": matches,\n      \"toggle\": toggle,\n      \"createElementFromHTML\": createElementFromHTML,\n      \"remove\": remove,\n      // \"filter\": filter,\n      \"untilAll\": untilAll,\n      \"nextAll\": nextAll,\n      \"prevAll\": prevAll,\n      \"showError\": showError\n    };\n\n    var utils = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        showError: showError,\n        isVisible: isVisible,\n        getVisible: getVisible,\n        $: $,\n        deepExtend: deepExtend,\n        hasClass: hasClass,\n        getWindowHeight: getWindowHeight,\n        getWindowWidth: getWindowWidth,\n        css: css,\n        prev: prev,\n        next: next,\n        last: last,\n        index: index,\n        getList: getList,\n        hide: hide,\n        show: show,\n        isArrayOrList: isArrayOrList,\n        addClass: addClass,\n        removeClass: removeClass,\n        appendTo: appendTo,\n        wrap: wrap,\n        wrapAll: wrapAll,\n        wrapInner: wrapInner,\n        unwrap: unwrap,\n        closest: closest,\n        after: after,\n        before: before,\n        insertBefore: insertBefore,\n        getScrollTop: getScrollTop,\n        siblings: siblings,\n        preventDefault: preventDefault,\n        getAttr: getAttr,\n        docAddEvent: docAddEvent,\n        windowAddEvent: windowAddEvent,\n        docRemoveEvent: docRemoveEvent,\n        windowRemoveEvent: windowRemoveEvent,\n        isFunction: isFunction,\n        trigger: trigger,\n        matches: matches,\n        toggle: toggle,\n        createElementFromHTML: createElementFromHTML,\n        remove: remove,\n        untilAll: untilAll,\n        nextAll: nextAll,\n        prevAll: prevAll,\n        toArray: toArray,\n        getLast: getLast,\n        getAverage: getAverage,\n        setSrc: setSrc,\n        getParentsUntil: getParentsUntil,\n        isInsideInput: isInsideInput\n    });\n\n    function _typeof(obj) {\n      \"@babel/helpers - typeof\";\n\n      if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n        _typeof = function (obj) {\n          return typeof obj;\n        };\n      } else {\n        _typeof = function (obj) {\n          return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n        };\n      }\n\n      return _typeof(obj);\n    }\n\n    var EventEmitter = {\n      events: {},\n      on: function on(event, listener) {\n        var _this = this;\n\n        if (_typeof(this.events[event]) !== 'object') {\n          this.events[event] = [];\n        }\n\n        this.events[event].push(listener);\n        return function () {\n          return _this.removeListener(event, listener);\n        };\n      },\n      removeListener: function removeListener(event, listener) {\n        if (_typeof(this.events[event]) === 'object') {\n          var idx = this.events[event].indexOf(listener);\n\n          if (idx > -1) {\n            this.events[event].splice(idx, 1);\n          }\n        }\n      },\n      emit: function emit(event) {\n        var _this2 = this;\n\n        for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n          args[_key - 1] = arguments[_key];\n        }\n\n        if (_typeof(this.events[event]) === 'object') {\n          this.events[event].forEach(function (listener) {\n            return listener.apply(_this2, args);\n          });\n        }\n      },\n      once: function once(event, listener) {\n        var _this3 = this;\n\n        var remove = this.on(event, function () {\n          remove();\n\n          for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n            args[_key2] = arguments[_key2];\n          }\n\n          listener.apply(_this3, args);\n        });\n      }\n    };\n\n    var state = {\n      numSections: 0,\n      numSlides: 0,\n      slides: [],\n      sections: [],\n      activeSection: null,\n      scrollTrigger: null,\n      isBeyondFullpage: false,\n      aboutToScrollToFullPage: false,\n      slideMoving: false,\n      isResizing: false,\n      isScrolling: false,\n      lastScrolledDestiny: undefined,\n      lastScrolledSlide: undefined,\n      activeAnimation: false,\n      canScroll: true,\n      touchDirection: 'none',\n      wheelDirection: 'none',\n      isGrabbing: false,\n      isUsingWheel: false,\n      isWindowFocused: true,\n      previousDestTop: 0,\n      windowsHeight: getWindowHeight(),\n      isDoingContinousVertical: false,\n      timeouts: {},\n      scrollY: 0,\n      scrollX: 0\n    }; // @ts-ignore\n\n    win.state = state;\n    function setState(props) {\n      Object.assign(state, props);\n    }\n    function getState() {\n      return state;\n    }\n    function getActivePanel() {\n      return state.activeSection && state.activeSection.activeSlide ? state.activeSection.activeSlide : state.activeSection;\n    }\n\n    var events = {\n      onAfterRenderNoAnchor: 'onAfterRenderNoAnchor',\n      onClickOrTouch: 'onClickOrTouch',\n      moveSlideLeft: 'moveSlideLeft',\n      moveSlideRight: 'moveSlideRight',\n      onInitialise: 'onInitialise',\n      beforeInit: 'beforeInit',\n      bindEvents: 'bindEvents',\n      onDestroy: 'onDestroy',\n      contentChanged: 'contentChanged',\n      onScrollOverflowScrolled: 'onScrollOverflowScrolled',\n      onScrollPageAndSlide: 'onScrollPageAndSlide',\n      onKeyDown: 'onKeyDown',\n      onMenuClick: 'onMenuClick',\n      scrollPage: 'scrollPage',\n      landscapeScroll: 'landscapeScroll',\n      scrollBeyondFullpage: 'scrollBeyondFullpage',\n      onPerformMovement: 'onPerformMovement',\n      onSlideLeave: 'onSlideLeave',\n      onLeave: 'onLeave',\n      afterSectionLoads: 'afterSectionLoads',\n      afterSlideLoads: 'afterSlideLoads'\n    };\n\n    EventEmitter.on(events.bindEvents, bindEvents$c);\n\n    function bindEvents$c() {\n      //Scrolls to the section when clicking the navigation bullet\n      //simulating the jQuery .on('click') event using delegation\n      ['click', 'touchstart'].forEach(function (eventName) {\n        docAddEvent(eventName, delegatedEvents);\n      });\n      windowAddEvent('focus', focusHandler);\n      internalEvents();\n    }\n\n    function internalEvents() {\n      EventEmitter.on(events.onDestroy, onDestroy$9);\n    }\n\n    function delegatedEvents(e) {\n      EventEmitter.emit(events.onClickOrTouch, {\n        e: e,\n        target: e.target\n      });\n    }\n\n    function onDestroy$9() {\n      ['click', 'touchstart'].forEach(function (eventName) {\n        docRemoveEvent(eventName, delegatedEvents);\n      });\n    } // changing isWindowFocused to true on focus event\n\n\n    function focusHandler() {\n      setState({\n        isWindowFocused: true\n      });\n    }\n\n    // keeping central set of classnames and selectors\n    var WRAPPER = 'fullpage-wrapper';\n    var WRAPPER_SEL = '.' + WRAPPER; // slimscroll\n\n    var SCROLLABLE = 'fp-scrollable';\n\n    var RESPONSIVE = 'fp-responsive';\n    var NO_TRANSITION = 'fp-notransition';\n    var DESTROYED = 'fp-destroyed';\n    var ENABLED = 'fp-enabled';\n    var VIEWING_PREFIX = 'fp-viewing';\n    var ACTIVE = 'active';\n    var ACTIVE_SEL = '.' + ACTIVE;\n    var COMPLETELY = 'fp-completely';\n    var COMPLETELY_SEL = '.' + COMPLETELY; // section\n\n    var SECTION_DEFAULT_SEL = '.section';\n    var SECTION = 'fp-section';\n    var SECTION_SEL = '.' + SECTION;\n    var SECTION_ACTIVE_SEL = SECTION_SEL + ACTIVE_SEL;\n    var TABLE_CELL = 'fp-tableCell';\n    var TABLE_CELL_SEL = '.' + TABLE_CELL;\n    var AUTO_HEIGHT = 'fp-auto-height';\n    var AUTO_HEIGHT_SEL = '.' + AUTO_HEIGHT;\n    var AUTO_HEIGHT_RESPONSIVE = 'fp-auto-height-responsive';\n    var AUTO_HEIGHT_RESPONSIVE_SEL = '.' + AUTO_HEIGHT_RESPONSIVE;\n    var NORMAL_SCROLL = 'fp-normal-scroll';\n\n    var SECTION_NAV = 'fp-nav';\n    var SECTION_NAV_SEL = '#' + SECTION_NAV;\n    var SECTION_NAV_TOOLTIP = 'fp-tooltip';\n    var SECTION_NAV_TOOLTIP_SEL = '.' + SECTION_NAV_TOOLTIP;\n    var SHOW_ACTIVE_TOOLTIP = 'fp-show-active'; // slide\n\n    var SLIDE_DEFAULT_SEL = '.slide';\n    var SLIDE = 'fp-slide';\n    var SLIDE_SEL = '.' + SLIDE;\n    var SLIDE_ACTIVE_SEL = SLIDE_SEL + ACTIVE_SEL;\n    var SLIDES_WRAPPER = 'fp-slides';\n    var SLIDES_WRAPPER_SEL = '.' + SLIDES_WRAPPER;\n    var SLIDES_CONTAINER = 'fp-slidesContainer';\n    var SLIDES_CONTAINER_SEL = '.' + SLIDES_CONTAINER;\n    var TABLE = 'fp-table';\n    var OVERFLOW = 'fp-overflow';\n    var OVERFLOW_SEL = '.' + OVERFLOW;\n    var IS_OVERFLOW = 'fp-is-overflow'; // slide nav\n\n    var SLIDES_NAV = 'fp-slidesNav';\n    var SLIDES_NAV_SEL = '.' + SLIDES_NAV;\n    var SLIDES_NAV_LINK_SEL = SLIDES_NAV_SEL + ' a';\n    var SLIDES_STYLED_ARROW = 'fp-arrow';\n    var SLIDES_ARROW = 'fp-controlArrow';\n    var SLIDES_ARROW_SEL = '.' + SLIDES_ARROW;\n    var SLIDES_PREV = 'fp-prev';\n    var SLIDES_PREV_SEL = '.' + SLIDES_PREV;\n    var SLIDES_ARROW_PREV_SEL = SLIDES_ARROW_SEL + SLIDES_PREV_SEL;\n    var SLIDES_NEXT = 'fp-next';\n    var SLIDES_NEXT_SEL = '.' + SLIDES_NEXT;\n    var SLIDES_ARROW_NEXT_SEL = SLIDES_ARROW_SEL + SLIDES_NEXT_SEL;\n\n    var defaultOptions = {\n      //navigation\n      menu: false,\n      anchors: [],\n      lockAnchors: false,\n      navigation: false,\n      navigationPosition: 'right',\n      navigationTooltips: [],\n      showActiveTooltip: false,\n      slidesNavigation: false,\n      slidesNavPosition: 'bottom',\n      scrollBar: false,\n      hybrid: false,\n      licenseKey: '',\n      credits: {\n        \"enabled\": true,\n        \"label\": 'Made with fullPage.js',\n        \"position\": 'right'\n      },\n      //scrolling\n      css3: true,\n      scrollingSpeed: 700,\n      autoScrolling: true,\n      fitToSection: true,\n      fitToSectionDelay: 600,\n      easing: 'easeInOutCubic',\n      easingcss3: 'ease',\n      loopBottom: false,\n      loopTop: false,\n      loopHorizontal: true,\n      continuousVertical: false,\n      continuousHorizontal: false,\n      scrollHorizontally: false,\n      interlockedSlides: false,\n      dragAndMove: false,\n      offsetSections: false,\n      resetSliders: false,\n      fadingEffect: false,\n      normalScrollElements: null,\n      scrollOverflow: true,\n      scrollOverflowReset: false,\n      touchSensitivity: 5,\n      touchWrapper: null,\n      bigSectionsDestination: null,\n      //Accessibility\n      keyboardScrolling: true,\n      animateAnchor: true,\n      recordHistory: true,\n      allowCorrectDirection: false,\n      //design\n      scrollOverflowMacStyle: true,\n      controlArrows: true,\n      controlArrowsHTML: ['<div class=\"' + SLIDES_STYLED_ARROW + '\"></div>', '<div class=\"' + SLIDES_STYLED_ARROW + '\"></div>'],\n      controlArrowColor: '#fff',\n      verticalCentered: true,\n      sectionsColor: [],\n      paddingTop: 0,\n      paddingBottom: 0,\n      fixedElements: null,\n      responsive: 0,\n      //backwards compabitility with responsiveWiddth\n      responsiveWidth: 0,\n      responsiveHeight: 0,\n      responsiveSlides: false,\n      parallax: false,\n      parallaxOptions: {\n        type: 'reveal',\n        percentage: 62,\n        property: 'translate'\n      },\n      cards: false,\n      cardsOptions: {\n        perspective: 100,\n        fadeContent: true,\n        fadeBackground: true\n      },\n      //Custom selectors\n      sectionSelector: SECTION_DEFAULT_SEL,\n      slideSelector: SLIDE_DEFAULT_SEL,\n      //events\n      afterLoad: null,\n      beforeLeave: null,\n      onLeave: null,\n      afterRender: null,\n      afterResize: null,\n      afterReBuild: null,\n      afterSlideLoad: null,\n      onSlideLeave: null,\n      afterResponsive: null,\n      onScrollOverflow: null,\n      lazyLoading: true,\n      observer: true,\n      scrollBeyondFullpage: true\n    };\n\n    var container = null;\n    var g_initialAnchorsInDom = false;\n    var originals = deepExtend({}, defaultOptions); //deep copy\n\n    var g_options = null;\n    function getInitialAnchorsInDom() {\n      return g_initialAnchorsInDom;\n    }\n    function setContainer(value) {\n      container = value;\n    }\n    function getContainer(value) {\n      return container;\n    }\n    function getOptions() {\n      return g_options || defaultOptions;\n    }\n    function setOptions(options) {\n      g_options = deepExtend({}, defaultOptions, options);\n      originals = Object.assign({}, g_options);\n    }\n    function getOriginals() {\n      return originals;\n    }\n    function setOption(name, value) {\n      defaultOptions[name] = value;\n    }\n    /*\n    * Sets the state for a variable with multiple states (original, and temporal)\n    * Some variables such as `autoScrolling` or `recordHistory` might change automatically its state when using `responsive` or `autoScrolling:false`.\n    * This function is used to keep track of both states, the original and the temporal one.\n    * If type is not 'internal', then we assume the user is globally changing the variable.\n    */\n\n    function setVariableState(variable, value, type) {\n      g_options[variable] = value;\n\n      if (type !== 'internal') {\n        originals[variable] = value;\n      }\n    }\n    /**\n    * Setting options from DOM elements if they are not provided.\n    */\n\n    function setOptionsFromDOM() {\n      //no anchors option? Checking for them in the DOM attributes\n      if (!getOptions().anchors.length) {\n        var anchorsAttribute = '[data-anchor]';\n        var anchors = $(getOptions().sectionSelector.split(',').join(anchorsAttribute + ',') + anchorsAttribute, container);\n\n        if (anchors.length && anchors.length === $(getOptions().sectionSelector, container).length) {\n          g_initialAnchorsInDom = true;\n          anchors.forEach(function (item) {\n            getOptions().anchors.push(getAttr(item, 'data-anchor').toString());\n          });\n        }\n      } //no tooltips option? Checking for them in the DOM attributes\n\n\n      if (!getOptions().navigationTooltips.length) {\n        var tooltipsAttribute = '[data-tooltip]';\n        var tooltips = $(getOptions().sectionSelector.split(',').join(tooltipsAttribute + ',') + tooltipsAttribute, container);\n\n        if (tooltips.length) {\n          tooltips.forEach(function (item) {\n            getOptions().navigationTooltips.push(getAttr(item, 'data-tooltip').toString());\n          });\n        }\n      }\n    }\n\n    var plainItem = function plainItem(panel) {\n      this.anchor = panel.anchor;\n      this.item = panel.item;\n      this.index = panel.index();\n      this.isLast = this.index === panel.item.parentElement.querySelectorAll(panel.selector).length - 1;\n      this.isFirst = !this.index;\n      this.isActive = panel.isActive;\n    };\n    /**\n    * Item. Slide or Section objects share the same properties.\n    */\n\n    var Item = function Item(el, selector) {\n      this.parent = this.parent || null;\n      this.selector = selector;\n      this.anchor = getAttr(el, 'data-anchor') || getOptions().anchors[index(el, getOptions().sectionSelector)];\n      this.item = el;\n      this.isVisible = isVisible(el);\n      this.isActive = hasClass(el, ACTIVE);\n      this.hasScroll = hasClass(el, OVERFLOW) || $(OVERFLOW_SEL, el)[0] != null;\n      this.isSection = selector === getOptions().sectionSelector;\n      this.container = closest(el, SLIDES_CONTAINER_SEL) || closest(el, WRAPPER_SEL);\n\n      this.index = function () {\n        return this.siblings().indexOf(this);\n      };\n    };\n\n    Item.prototype.siblings = function () {\n      if (this.isSection) {\n        if (this.isVisible) {\n          return state.sections;\n        } else {\n          return state.sectionsIncludingHidden;\n        }\n      }\n\n      return this.parent ? this.parent.slides : 0;\n    };\n\n    Item.prototype.prev = function () {\n      var siblings = this.siblings();\n      var currentIndex = this.isSection ? siblings.indexOf(this) : this.parent.slides.indexOf(this);\n      var prevIndex = currentIndex - 1;\n\n      if (prevIndex >= 0) {\n        return siblings[prevIndex];\n      }\n\n      return null;\n    };\n\n    Item.prototype.next = function () {\n      var siblings = this.siblings();\n      var currentIndex = this.isSection ? siblings.indexOf(this) : this.parent.slides.indexOf(this);\n      var nextIndex = currentIndex + 1;\n\n      if (nextIndex < siblings.length) {\n        return siblings[nextIndex];\n      }\n\n      return null;\n    };\n\n    Item.prototype[\"prevPanel\"] = function () {\n      return this.prev() || (this.parent ? this.parent.prev() : null);\n    };\n\n    Item.prototype[\"nextPanel\"] = function () {\n      return this.next() || (this.parent ? this.parent.next() : null);\n    };\n\n    Item.prototype.getSiblings = function () {\n      if (this.isSection) {\n        return state.sections;\n      }\n\n      return state.panels;\n    };\n\n    function getNodes(panels) {\n      return panels.map(function (panel) {\n        return panel.item;\n      });\n    }\n    function getPanelByElement(panels, el) {\n      return panels.find(function (panel) {\n        return panel.item === el;\n      });\n    }\n    var Section = function Section(el) {\n      plainItem.call(this, el);\n    };\n    var Slide = function Slide(el) {\n      plainItem.call(this, el);\n    };\n\n    /**\n    * Gets the active slide (or section) for the given section\n    */\n\n    function getSlideOrSection(destiny) {\n      var slide = $(SLIDE_ACTIVE_SEL, destiny);\n\n      if (slide.length) {\n        destiny = slide[0];\n      }\n\n      return destiny;\n    }\n    function getSlideOrSectionPanel(panel) {\n      if (!panel) {\n        return null;\n      }\n\n      return panel.activeSlide ? panel.activeSlide : panel;\n    }\n    function isFullPageAbove() {\n      return getContainer().getBoundingClientRect().bottom >= 0;\n    }\n    /**\n    * Gets the scrolling settings depending on the plugin autoScrolling option\n    */\n\n    function getScrollSettings(top) {\n      var options = getOptions();\n      var position;\n      var element; //top property animation\n\n      if (options.autoScrolling && !options.scrollBar) {\n        position = -top;\n        element = $(WRAPPER_SEL)[0];\n      } //window real scrolling\n      else {\n        position = top;\n        element = window;\n      }\n\n      return {\n        options: position,\n        element: element\n      };\n    }\n    /**\n    * Scrolls the page / slider the given number of pixels.\n    * It will do it one or another way dependiong on the library's config.\n    */\n\n    function setScrolling(element, val) {\n      if (!getOptions().autoScrolling || getOptions().scrollBar || element.self != window && hasClass(element, SLIDES_WRAPPER)) {\n        //scrolling horizontally through the slides?\n        if (element.self != window && hasClass(element, SLIDES_WRAPPER)) {\n          element.scrollLeft = val;\n        } //vertical scroll\n        else {\n          element.scrollTo(0, val);\n        }\n      } else {\n        element.style.top = val + 'px';\n      }\n    }\n    /**\n    * Adds transition animations for the given element\n    */\n\n    function addAnimation(element) {\n      var transition = 'transform ' + getOptions().scrollingSpeed + 'ms ' + getOptions().easingcss3;\n      removeClass(element, NO_TRANSITION);\n      return css(element, {\n        '-webkit-transition': transition,\n        'transition': transition\n      });\n    }\n    /**\n    * Retuns `up` or `down` depending on the scrolling movement to reach its destination\n    * from the current section.\n    */\n\n    function getYmovement(activeSection, destiny) {\n      var fromIndex = activeSection.index();\n      var toIndex = index(destiny, SECTION_SEL);\n\n      if (fromIndex == toIndex) {\n        return 'none';\n      }\n\n      if (fromIndex > toIndex) {\n        return 'up';\n      }\n\n      return 'down';\n    }\n    /**\n    * Remove transition animations for the given element\n    */\n\n    function removeAnimation(element) {\n      return addClass(element, NO_TRANSITION);\n    }\n    /**\n    * Returns the cross-browser transform string.\n    */\n\n    function getTransforms(translate3d) {\n      return {\n        '-webkit-transform': translate3d,\n        '-moz-transform': translate3d,\n        '-ms-transform': translate3d,\n        'transform': translate3d\n      };\n    }\n\n    var silentScrollId;\n    /**\n    * Adds a css3 transform property to the container class with or without animation depending on the animated param.\n    */\n\n    function transformContainer(translate3d, animated) {\n      if (animated) {\n        addAnimation(getContainer());\n      } else {\n        removeAnimation(getContainer());\n      }\n\n      clearTimeout(silentScrollId);\n      css(getContainer(), getTransforms(translate3d));\n      FP.test.translate3d = translate3d; //syncronously removing the class after the animation has been applied.\n\n      silentScrollId = setTimeout(function () {\n        removeClass(getContainer(), NO_TRANSITION);\n      }, 10);\n    }\n\n    /**\n    * Scrolls silently (with no animation) the page to the given Y position.\n    */\n\n    function silentScroll(top) {\n      // The first section can have a negative value in iOS 10. Not quite sure why: -0.0142822265625\n      // that's why we round it to 0.\n      var roundedTop = Math.round(top);\n\n      if (getOptions().css3 && getOptions().autoScrolling && !getOptions().scrollBar) {\n        var translate3d = 'translate3d(0px, -' + roundedTop + 'px, 0px)';\n        transformContainer(translate3d, false);\n      } else if (getOptions().autoScrolling && !getOptions().scrollBar) {\n        css(getContainer(), {\n          'top': -roundedTop + 'px'\n        });\n        FP.test.top = -roundedTop + 'px';\n      } else {\n        var scrollSettings = getScrollSettings(roundedTop);\n        setScrolling(scrollSettings.element, scrollSettings.options);\n      }\n    }\n\n    FP.setScrollingSpeed = setScrollingSpeed;\n    /**\n    * Defines the scrolling speed\n    */\n\n    function setScrollingSpeed(value, type) {\n      setVariableState('scrollingSpeed', value, type);\n    }\n\n    var $body = null;\n    var $html = null;\n    var $htmlBody = null; // caching common elements\n\n    function setCache() {\n      $body = $('body')[0];\n      $html = $('html')[0];\n      $htmlBody = $('html, body');\n    }\n\n    //@ts-check\n\n    var _g_animateScroll;\n    /**\n    * Simulates the animated scrollTop of jQuery. Used when css3:false or scrollBar:true or autoScrolling:false\n    * http://stackoverflow.com/a/16136789/1081396\n    */\n\n\n    function scrollTo(element, to, duration, callback) {\n      var start = getScrolledPosition(element);\n      var change = to - start;\n      var isCallbackFired = false;\n      var startTime;\n      var wasAnimationActive = state.activeAnimation;\n      setState({\n        activeAnimation: true\n      }); // Cancelling any possible previous animations (io: clicking on nav dots very fast)\n\n      if (_g_animateScroll) {\n        window.cancelAnimationFrame(_g_animateScroll);\n      }\n\n      _g_animateScroll = function g_animateScroll(timestamp) {\n        if (!startTime) {\n          startTime = timestamp;\n        }\n\n        var currentTime = Math.floor(timestamp - startTime);\n\n        if (state.activeAnimation) {\n          //in order to stope it from other function whenever we want\n          var val = to;\n\n          if (duration) {\n            // @ts-ignore\n            val = win.fp_easings[getOptions().easing](currentTime, start, change, duration);\n          }\n\n          if (currentTime <= duration) {\n            setScrolling(element, val);\n          }\n\n          if (currentTime < duration) {\n            window.requestAnimationFrame(_g_animateScroll);\n          } else if (typeof callback !== 'undefined' && !isCallbackFired) {\n            callback();\n            setState({\n              activeAnimation: false\n            });\n            isCallbackFired = true;\n          }\n        } else if (!isCallbackFired && !wasAnimationActive) {\n          callback();\n          setState({\n            activeAnimation: false\n          });\n          isCallbackFired = true;\n        }\n      };\n\n      window.requestAnimationFrame(_g_animateScroll);\n    }\n    /**\n    * Getting the position of the element to scroll when using jQuery animations\n    */\n\n    function getScrolledPosition(element) {\n      var position; //is not the window element and is a slide?\n\n      if (element.self != win && hasClass(element, SLIDES_WRAPPER)) {\n        position = element.scrollLeft;\n      } else if (!getOptions().autoScrolling || getOptions().scrollBar) {\n        position = getScrollTop();\n      } else {\n        position = element.offsetTop;\n      } //gets the top property of the wrapper\n\n\n      return position;\n    }\n\n    /**\n    * Makes sure to only create a Panel object if the element exist\n    */\n\n    function nullOrSection(el) {\n      if (el && !el.item) {\n        return new Section(new SectionPanel(el));\n      }\n\n      return el ? new Section(el) : null;\n    }\n\n    function nullOrSlide(el) {\n      return el ? new Slide(el) : null;\n    }\n\n    /**\n    * Dispatch events & callbacks\n    */\n\n    function fireCallback(eventName, v) {\n      var eventData = getEventData(eventName, v);\n      trigger(getContainer(), eventName, eventData);\n\n      if (getOptions()[eventName].apply(eventData[Object.keys(eventData)[0]], toArray(eventData)) === false) {\n        return false;\n      }\n\n      return true;\n    }\n    /**\n    * Gets the event's data for the given event on the right format.\n    */\n\n    function getEventData(eventName, v) {\n      //using functions to run only the necessary bits within the object\n      var paramsPerEvent = {\n        afterRender: function afterRender() {\n          return {\n            section: nullOrSection(getState().activeSection),\n            slide: nullOrSlide(getState().activeSection.activeSlide)\n          };\n        },\n        onLeave: function onLeave() {\n          return {\n            origin: nullOrSection(v.items.origin),\n            destination: nullOrSection(v.items.destination),\n            direction: v.direction,\n            trigger: getState().scrollTrigger\n          };\n        },\n        afterLoad: function afterLoad() {\n          return paramsPerEvent.onLeave();\n        },\n        afterSlideLoad: function afterSlideLoad() {\n          return {\n            section: nullOrSection(v.items.section),\n            origin: nullOrSection(v.items.origin),\n            destination: nullOrSection(v.items.destination),\n            direction: v.direction,\n            trigger: getState().scrollTrigger\n          };\n        },\n        onSlideLeave: function onSlideLeave() {\n          return paramsPerEvent.afterSlideLoad();\n        },\n        beforeLeave: function beforeLeave() {\n          return paramsPerEvent.onLeave();\n        },\n        onScrollOverflow: function onScrollOverflow() {\n          return {\n            section: nullOrSection(getState().activeSection),\n            slide: nullOrSlide(getState().activeSection.activeSlide),\n            position: v.position,\n            direction: v.direction\n          };\n        }\n      };\n      return paramsPerEvent[eventName]();\n    }\n\n    /**\n    * Plays video and audio elements.\n    */\n\n    function playMedia(destiny) {\n      var panel = getSlideOrSection(destiny); //playing HTML5 media elements\n\n      $('video, audio', panel).forEach(function (element) {\n        if (element.hasAttribute('data-autoplay') && typeof element.play === 'function') {\n          element.play();\n        }\n      }); //youtube videos\n\n      $('iframe[src*=\"youtube.com/embed/\"]', panel).forEach(function (element) {\n        if (element.hasAttribute('data-autoplay')) {\n          playYoutube(element);\n        } //in case the URL was not loaded yet. On page load we need time for the new URL (with the API string) to load.\n\n\n        element.onload = function () {\n          if (element.hasAttribute('data-autoplay')) {\n            playYoutube(element);\n          }\n        };\n      });\n    }\n    /**\n    * Plays a youtube video\n    */\n\n    function playYoutube(element) {\n      element.contentWindow.postMessage('{\"event\":\"command\",\"func\":\"playVideo\",\"args\":\"\"}', '*');\n    }\n    /**\n    * Stops video and audio elements.\n    */\n\n\n    function stopMedia(destiny) {\n      var panel = getSlideOrSection(destiny); //stopping HTML5 media elements\n\n      $('video, audio', panel).forEach(function (element) {\n        if (!element.hasAttribute('data-keepplaying') && typeof element.pause === 'function') {\n          element.pause();\n        }\n      }); //youtube videos\n\n      $('iframe[src*=\"youtube.com/embed/\"]', panel).forEach(function (element) {\n        if (/youtube\\.com\\/embed\\//.test(getAttr(element, 'src')) && !element.hasAttribute('data-keepplaying')) {\n          element.contentWindow.postMessage('{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*');\n        }\n      });\n    }\n    /*\n    * Enables the Youtube videos API so we can control their flow if necessary.\n    */\n\n    function enableYoutubeAPI() {\n      $('iframe[src*=\"youtube.com/embed/\"]', getContainer()).forEach(function (item) {\n        addURLParam(item, 'enablejsapi=1');\n      });\n    }\n    /**\n    * Adds a new parameter and its value to the `src` of a given element\n    */\n\n    function addURLParam(element, newParam) {\n      var originalSrc = getAttr(element, 'src');\n      element.setAttribute('src', originalSrc + getUrlParamSign(originalSrc) + newParam);\n    }\n    /*\n    * Returns the prefix sign to use for a new parameter in an existen URL.\n    *\n    * @return {String}  ? | &\n    */\n\n\n    function getUrlParamSign(url) {\n      return !/\\?/.test(url) ? '?' : '&';\n    }\n\n    /**\n    * Lazy loads image, video and audio elements.\n    */\n\n    function lazyLoad(destiny) {\n      if (!getOptions().lazyLoading) {\n        return;\n      }\n\n      var panel = getSlideOrSection(destiny);\n      $('img[data-src], img[data-srcset], source[data-src], source[data-srcset], video[data-src], audio[data-src], iframe[data-src]', panel).forEach(function (element) {\n        ['src', 'srcset'].forEach(function (type) {\n          var attribute = getAttr(element, 'data-' + type);\n\n          if (attribute != null && attribute) {\n            setSrc(element, type);\n            element.addEventListener('load', function () {\n            });\n          }\n        });\n\n        if (matches(element, 'source')) {\n          var elementToPlay = closest(element, 'video, audio');\n\n          if (elementToPlay) {\n            elementToPlay.load();\n\n            elementToPlay.onloadeddata = function () {\n            };\n          }\n        }\n      });\n    }\n\n    /**\n    * Sets a class for the body of the page depending on the active section / slide\n    */\n\n    function setBodyClass() {\n      var section = getState().activeSection.item;\n      var slide = getState().activeSection.activeSlide;\n      var sectionAnchor = getAnchor(section);\n      var text = String(sectionAnchor);\n\n      if (slide) {\n        var slideAnchor = getAnchor(slide.item);\n        text = text + '-' + slideAnchor;\n      } //changing slash for dash to make it a valid CSS style\n\n\n      text = text.replace('/', '-').replace('#', ''); //removing previous anchor classes\n\n      var classRe = new RegExp('\\\\b\\\\s?' + VIEWING_PREFIX + '-[^\\\\s]+\\\\b', \"g\");\n      $body.className = $body.className.replace(classRe, ''); //adding the current anchor\n\n      addClass($body, VIEWING_PREFIX + '-' + text);\n    }\n    /**\n    * Gets the anchor for the given slide / section. Its index will be used if there's none.\n    */\n\n    function getAnchor(element) {\n      if (!element) {\n        return null;\n      }\n\n      var anchor = getAttr(element, 'data-anchor');\n      var elementIndex = index(element); //Slide without anchor link? We take the index instead.\n\n      if (anchor == null) {\n        anchor = elementIndex;\n      }\n\n      return anchor;\n    }\n\n    /**\n    * Sets the state of the website depending on the active section/slide.\n    * It changes the URL hash when needed and updates the body class.\n    */\n\n    function setPageStatus(slideIndex, slideAnchor, anchorLink) {\n      var sectionHash = '';\n\n      if (getOptions().anchors.length && !getOptions().lockAnchors) {\n        //isn't it the first slide?\n        if (slideIndex) {\n          if (anchorLink != null) {\n            sectionHash = anchorLink;\n          } //slide without anchor link? We take the index instead.\n\n\n          if (slideAnchor == null) {\n            slideAnchor = slideIndex;\n          }\n\n          setState({\n            lastScrolledSlide: slideAnchor\n          });\n          setUrlHash(sectionHash + '/' + slideAnchor); //first slide won't have slide anchor, just the section one\n        } else if (slideIndex != null) {\n          setState({\n            lastScrolledSlide: slideAnchor\n          });\n          setUrlHash(anchorLink);\n        } //section without slides\n        else {\n          setUrlHash(anchorLink);\n        }\n      }\n\n      setBodyClass();\n    }\n    /**\n    * Sets the URL hash.\n    */\n\n    function setUrlHash(url) {\n      if (getOptions().recordHistory) {\n        location.hash = url;\n      } else {\n        //Mobile Chrome doesn't work the normal way, so... lets use HTML5 for phones :)\n        if (isTouchDevice || isTouch) {\n          win.history.replaceState(undefined, undefined, '#' + url);\n        } else {\n          var baseUrl = win.location.href.split('#')[0];\n          win.location.replace(baseUrl + '#' + url);\n        }\n      }\n    }\n\n    /**\n    * Gets the name for screen readers for a section/slide navigation bullet.\n    */\n\n    function getBulletLinkName(i, defaultName, item) {\n      var anchor = defaultName === 'Section' ? getOptions().anchors[i] : getAttr(item, 'data-anchor');\n      return encodeURI(getOptions().navigationTooltips[i] || anchor || defaultName + ' ' + (i + 1));\n    }\n\n    function slideBulletHandler(e) {\n      // not all events are cancellable \n      // https://www.uriports.com/blog/easy-fix-for-intervention-ignored-attempt-to-cancel-a-touchmove-event-with-cancelable-false/\n      if (e.cancelable) {\n        preventDefault(e);\n      }\n\n      setState({\n        scrollTrigger: 'horizontalNav'\n      });\n      /*jshint validthis:true */\n\n      var sectionElem = closest(this, SECTION_SEL);\n      var slides = $(SLIDES_WRAPPER_SEL, closest(this, SECTION_SEL))[0];\n      var section = getPanelByElement(getState().sections, sectionElem);\n      var destiny = section.slides[index(closest(this, 'li'))];\n      EventEmitter.emit(events.landscapeScroll, {\n        slides: slides,\n        destination: destiny.item\n      });\n    }\n    /**\n    * Sets the state for the horizontal bullet navigations.\n    */\n\n    function activeSlidesNavigation(slidesNav, slideIndex) {\n      if (getOptions().slidesNavigation && slidesNav != null) {\n        removeClass($(ACTIVE_SEL, slidesNav), ACTIVE);\n        addClass($('a', $('li', slidesNav)[slideIndex]), ACTIVE);\n      }\n    }\n    /**\n    * Creates a landscape navigation bar with dots for horizontal sliders.\n    */\n\n    function addSlidesNavigation(section) {\n      var sectionElem = section.item;\n      var numSlides = section.slides.length;\n      appendTo(createElementFromHTML('<div class=\"' + SLIDES_NAV + '\"><ul></ul></div>'), sectionElem);\n      var nav = $(SLIDES_NAV_SEL, sectionElem)[0]; //top or bottom\n\n      addClass(nav, 'fp-' + getOptions().slidesNavPosition);\n\n      for (var i = 0; i < numSlides; i++) {\n        var slide = $(SLIDE_SEL, sectionElem)[i];\n        appendTo(createElementFromHTML('<li><a href=\"#\"><span class=\"fp-sr-only\">' + getBulletLinkName(i, 'Slide', slide) + '</span><span></span></a></li>'), $('ul', nav)[0]);\n      } //centering it\n\n\n      css(nav, {\n        'margin-left': '-' + nav.innerWidth / 2 + 'px'\n      });\n      var activeSlideIndex = section.activeSlide ? section.activeSlide.index() : 0;\n      addClass($('a', $('li', nav)[activeSlideIndex]), ACTIVE);\n    }\n\n    var isScrollAllowed = {};\n    isScrollAllowed.m = {\n      'up': true,\n      'down': true,\n      'left': true,\n      'right': true\n    };\n    isScrollAllowed.k = deepExtend({}, isScrollAllowed.m);\n    /**\n    * Allowing or disallowing the mouse/swipe scroll in a given direction. (not for keyboard)\n    * @param type m (mouse) or k (keyboard)\n    */\n\n    function setIsScrollAllowed(value, direction, type) {\n      //up, down, left, right\n      if (direction !== 'all') {\n        isScrollAllowed[type][direction] = value;\n      } //all directions?\n      else {\n        Object.keys(isScrollAllowed[type]).forEach(function (key) {\n          isScrollAllowed[type][key] = value;\n        });\n      }\n    }\n    function getIsScrollAllowed() {\n      return isScrollAllowed;\n    }\n\n    EventEmitter.on(events.onClickOrTouch, onClickOrTouch$2);\n\n    function onClickOrTouch$2(params) {\n      var target = params.target;\n\n      if (matches(target, SLIDES_ARROW_SEL) || closest(target, SLIDES_ARROW_SEL)) {\n        slideArrowHandler.call(target, params);\n      }\n    } //Scrolling horizontally when clicking on the slider controls.\n\n\n    function slideArrowHandler() {\n      /*jshint validthis:true */\n      var section = closest(this, SECTION_SEL);\n      /*jshint validthis:true */\n\n      if (hasClass(this, SLIDES_PREV)) {\n        if (getIsScrollAllowed().m.left) {\n          setState({\n            scrollTrigger: 'slideArrow'\n          });\n          EventEmitter.emit(events.moveSlideLeft, {\n            section: section\n          });\n        }\n      } else {\n        if (getIsScrollAllowed().m.right) {\n          setState({\n            scrollTrigger: 'slideArrow'\n          });\n          EventEmitter.emit(events.moveSlideRight, {\n            section: section\n          });\n        }\n      }\n    }\n    /**\n    * Creates the control arrows for the given section\n    */\n\n\n    function createSlideArrows(section) {\n      var sectionElem = section.item;\n      var arrows = [createElementFromHTML(getOptions().controlArrowsHTML[0]), createElementFromHTML(getOptions().controlArrowsHTML[1])];\n      after($(SLIDES_WRAPPER_SEL, sectionElem)[0], arrows);\n      addClass(arrows, SLIDES_ARROW);\n      addClass(arrows[0], SLIDES_PREV);\n      addClass(arrows[1], SLIDES_NEXT);\n\n      if (getOptions().controlArrowColor !== '#fff') {\n        css($(SLIDES_ARROW_NEXT_SEL, sectionElem), {\n          'border-color': 'transparent transparent transparent ' + getOptions().controlArrowColor\n        });\n        css($(SLIDES_ARROW_PREV_SEL, sectionElem), {\n          'border-color': 'transparent ' + getOptions().controlArrowColor + ' transparent transparent'\n        });\n      }\n\n      if (!getOptions().loopHorizontal) {\n        hide($(SLIDES_ARROW_PREV_SEL, sectionElem));\n      }\n    }\n    function toggleControlArrows(v) {\n      if (!getOptions().loopHorizontal && getOptions().controlArrows) {\n        //hidding it for the fist slide, showing for the rest\n        toggle($(SLIDES_ARROW_PREV_SEL, v.section), v.slideIndex !== 0); //hidding it for the last slide, showing for the rest\n\n        toggle($(SLIDES_ARROW_NEXT_SEL, v.section), next(v.destiny) != null);\n      }\n    }\n\n    FP.setRecordHistory = setRecordHistory;\n    /**\n    * Defines wheter to record the history for each hash change in the URL.\n    */\n\n    function setRecordHistory(value, type) {\n      setVariableState('recordHistory', value, type);\n    }\n\n    FP.setAutoScrolling = setAutoScrolling;\n    FP.test.setAutoScrolling = setAutoScrolling;\n    /**\n    * Sets the autoScroll option.\n    * It changes the scroll bar visibility and the history of the site as a result.\n    */\n\n    function setAutoScrolling(value, type) {\n      //removing the transformation\n      if (!value) {\n        silentScroll(0);\n      }\n\n      setVariableState('autoScrolling', value, type);\n      var element = getState().activeSection.item;\n\n      if (getOptions().autoScrolling && !getOptions().scrollBar) {\n        css($htmlBody, {\n          'overflow': 'hidden',\n          'height': '100%'\n        });\n        removeClass($body, 'fp-scrollable');\n        setRecordHistory(getOriginals().recordHistory, 'internal'); //for IE touch devices\n\n        css(getContainer(), {\n          '-ms-touch-action': 'none',\n          'touch-action': 'none'\n        });\n\n        if (element != null) {\n          //moving the container up\n          silentScroll(element.offsetTop);\n        }\n      } else {\n        css($htmlBody, {\n          'overflow': 'visible',\n          'height': 'initial'\n        });\n        addClass($body, 'fp-scrollable');\n        var recordHistory = !getOptions().autoScrolling ? false : getOriginals().recordHistory;\n        setRecordHistory(recordHistory, 'internal'); //for IE touch devices\n\n        css(getContainer(), {\n          '-ms-touch-action': '',\n          'touch-action': ''\n        }); //scrolling the page to the section with no animation\n\n        if (element != null) {\n          var scrollSettings = getScrollSettings(element.offsetTop);\n          scrollSettings.element.scrollTo(0, scrollSettings.options);\n        }\n      }\n    }\n\n    //@ts-check\n    /**\n    * Adds sections before or after the current one to create the infinite effect.\n    */\n\n    function createInfiniteSections(v) {\n      setState({\n        isDoingContinousVertical: true\n      });\n      var activeSectionItem = getState().activeSection.item; // Scrolling down\n\n      if (!v.isMovementUp) {\n        // Move all previous sections to after the active section\n        after(activeSectionItem, prevAll(activeSectionItem, SECTION_SEL).reverse());\n      } else {\n        // Scrolling up\n        // Move all next sections to before the active section\n        before(activeSectionItem, nextAll(activeSectionItem, SECTION_SEL));\n      } // Maintain the displayed position (now that we changed the element order)\n\n\n      silentScroll(getState().activeSection.item.offsetTop); // Maintain the active slides visible in the viewport\n\n      keepSlidesPosition$1(); // save for later the elements that still need to be reordered\n\n      v.wrapAroundElements = activeSectionItem; // Recalculate animation variables\n\n      v.dtop = v.element.offsetTop;\n      v.yMovement = getYmovement(getState().activeSection, v.element);\n      return v;\n    }\n    /**\n    * Maintains the active slides in the viewport\n    * (Because the `scroll` animation might get lost with some actions, such as when using continuousVertical)\n    */\n\n    function keepSlidesPosition$1() {\n      var activeSlides = $(SLIDE_ACTIVE_SEL);\n\n      for (var i = 0; i < activeSlides.length; i++) {\n        silentLandscapeScroll(activeSlides[i], 'internal');\n      }\n    }\n\n    //@ts-check\n    /**\n    * Maintains the active slides in the viewport\n    * (Because the `scroll` animation might get lost with some actions, such as when using continuousVertical)\n    */\n\n    function keepSlidesPosition() {\n      var activeSlides = $(SLIDE_ACTIVE_SEL);\n\n      for (var i = 0; i < activeSlides.length; i++) {\n        silentLandscapeScroll(activeSlides[i], 'internal');\n      }\n    }\n    /**\n    * Fix section order after continuousVertical changes have been animated\n    */\n\n\n    function continuousVerticalFixSectionOrder(v) {\n      // If continuousVertical is in effect (and autoScrolling would also be in effect then),\n      // finish moving the elements around so the direct navigation will function more simply\n      if (v.wrapAroundElements == null) {\n        return;\n      }\n\n      if (v.isMovementUp) {\n        before($(SECTION_SEL)[0], v.wrapAroundElements);\n      } else {\n        after($(SECTION_SEL)[getState().sections.length - 1], v.wrapAroundElements);\n      }\n\n      silentScroll(getState().activeSection.item.offsetTop); // Maintain the active slides visible in the viewport\n\n      keepSlidesPosition();\n      setState({\n        isDoingContinousVertical: false\n      });\n    }\n\n    /**\n    * Makes sure lazyload is done for other sections in the viewport that are not the\n    * active one. \n    */\n\n    function lazyLoadOthers() {\n      var hasAutoHeightSections = $(AUTO_HEIGHT_SEL)[0] || isResponsiveMode() && $(AUTO_HEIGHT_RESPONSIVE_SEL)[0]; //quitting when it doesn't apply\n\n      if (!getOptions().lazyLoading || !hasAutoHeightSections) {\n        return;\n      } //making sure to lazy load auto-height sections that are in the viewport\n\n\n      $(SECTION_SEL + ':not(' + ACTIVE_SEL + ')').forEach(function (section) {\n        if (isSectionInViewport(section)) {\n          lazyLoad(section);\n        }\n      });\n    }\n    /**\n    * Determines whether a section is in the viewport or not.\n    */\n\n    function isSectionInViewport(el) {\n      var rect = el.getBoundingClientRect();\n      var top = rect.top;\n      var bottom = rect.bottom; //sometimes there's a 1px offset on the bottom of the screen even when the \n      //section's height is the window.innerHeight one. I guess because pixels won't allow decimals.\n      //using this prevents from lazyLoading the section that is not yet visible \n      //(only 1 pixel offset is)\n\n      var pixelOffset = 2;\n      var isTopInView = top + pixelOffset < state.windowsHeight && top > 0;\n      var isBottomInView = bottom > pixelOffset && bottom < state.windowsHeight;\n      return isTopInView || isBottomInView;\n    }\n\n    function tooltipTextHandler() {\n      /*jshint validthis:true */\n      trigger(prev(this), 'click');\n    }\n    /**\n    * Activating the vertical navigation bullets according to the given slide name.\n    */\n\n    function activateNavDots(name, sectionIndex) {\n      var nav = $(SECTION_NAV_SEL)[0];\n\n      if (getOptions().navigation && nav != null && nav.style.display !== 'none') {\n        removeClass($(ACTIVE_SEL, nav), ACTIVE);\n\n        if (name) {\n          addClass($('a[href=\"#' + name + '\"]', nav), ACTIVE);\n        } else {\n          addClass($('a', $('li', nav)[sectionIndex]), ACTIVE);\n        }\n      }\n    }\n    /**\n    * Creates a vertical navigation bar.\n    */\n\n    function addVerticalNavigation() {\n      remove($(SECTION_NAV_SEL));\n      var navigation = doc.createElement('div');\n      navigation.setAttribute('id', SECTION_NAV);\n      var divUl = doc.createElement('ul');\n      navigation.appendChild(divUl);\n      appendTo(navigation, $body);\n      var nav = $(SECTION_NAV_SEL)[0];\n      addClass(nav, 'fp-' + getOptions().navigationPosition);\n\n      if (getOptions().showActiveTooltip) {\n        addClass(nav, SHOW_ACTIVE_TOOLTIP);\n      }\n\n      var li = '';\n\n      for (var i = 0; i < getState().sections.length; i++) {\n        var section = getState().sections[i];\n        var link = '';\n\n        if (getOptions().anchors.length) {\n          link = section.anchor;\n        }\n\n        li += '<li><a href=\"#' + encodeURI(link) + '\"><span class=\"fp-sr-only\">' + getBulletLinkName(section.index(), 'Section') + '</span><span></span></a>'; // Only add tooltip if needed (defined by user)\n\n        var tooltip = getOptions().navigationTooltips[section.index()];\n\n        if (typeof tooltip !== 'undefined' && tooltip !== '') {\n          li += '<div class=\"' + SECTION_NAV_TOOLTIP + ' fp-' + getOptions().navigationPosition + '\">' + tooltip + '</div>';\n        }\n\n        li += '</li>';\n      }\n\n      $('ul', nav)[0].innerHTML = li; //activating the current active section\n\n      var bullet = $('li', $(SECTION_NAV_SEL)[0])[getState().activeSection.index()];\n      addClass($('a', bullet), ACTIVE);\n    } //Scrolls to the section when clicking the navigation bullet\n\n    function sectionBulletHandler(e) {\n      if (e.preventDefault) {\n        preventDefault(e);\n      }\n\n      setState({\n        scrollTrigger: 'verticalNav'\n      });\n      /*jshint validthis:true */\n      // @ts-ignore\n\n      var indexBullet = index(closest(this, SECTION_NAV_SEL + ' li'));\n      EventEmitter.emit(events.scrollPage, {\n        destination: getState().sections[indexBullet]\n      });\n    }\n\n    /**\n    * Sets to active the current menu and vertical nav items.\n    */\n\n    function activateMenuAndNav(anchor, index) {\n      activateMenuElement(anchor);\n      activateNavDots(anchor, index);\n    }\n    /**\n    * Activating the website main menu elements according to the given slide name.\n    */\n\n    function activateMenuElement(name) {\n      if (getOptions().menu && getOptions().menu.length) {\n        $(getOptions().menu).forEach(function (menu) {\n          if (menu != null) {\n            removeClass($(ACTIVE_SEL, menu), ACTIVE);\n            addClass($('[data-menuanchor=\"' + name + '\"]', menu), ACTIVE);\n          }\n        });\n      }\n    }\n\n    new Date().getTime();\n    /**\n     * Triggers the callback once per scroll wheel action.\n     * Based on scrolling speed delay.\n     */\n\n    var oncePerScroll = function () {\n      var canTriggerEvent = true;\n      var prevWheelTime = new Date().getTime();\n      var result;\n      var isScrollingOnInit = !win.fullpage_api;\n      return function (scrollTrigger, callback) {\n        var currentTime = new Date().getTime();\n        var timeThreshold = scrollTrigger === 'wheel' ? getOptions().scrollingSpeed : 100;\n        canTriggerEvent = isScrollingOnInit || currentTime - prevWheelTime >= timeThreshold;\n        isScrollingOnInit = !win.fullpage_api;\n\n        if (canTriggerEvent) {\n          result = callback();\n          prevWheelTime = currentTime;\n        }\n\n        return typeof result !== 'undefined' ? result : true;\n      };\n    }();\n\n    /**\n    * Fires the wheel event once per mouse wheel trigger.\n    */\n\n    function fireCallbackOncePerScroll(callbackName, params) {\n      if (!isFunction(getOptions().beforeLeave)) {\n        return;\n      }\n\n      var result = oncePerScroll(getState().scrollTrigger, function () {\n        return fireCallback(callbackName, params);\n      });\n      return result;\n    }\n\n    FP.moveTo = moveTo;\n\n    FP.getScrollY = function () {\n      return state.scrollY;\n    };\n\n    var g_afterSectionLoadsId;\n    var g_transitionLapseId;\n    EventEmitter.on(events.onDestroy, onDestroy$8);\n    /**\n    * Scrolls the site to the given element and scrolls to the slide if a callback is given.\n    */\n\n    function scrollPage(section, callback, isMovementUp) {\n      var element = section.item;\n\n      if (element == null) {\n        return;\n      } //there's no element to scroll, leaving the function\n\n\n      var dtop = getDestinationPosition(element);\n      var slideAnchorLink;\n      var slideIndex; //local variables\n\n      var v = {\n        \"element\": element,\n        \"callback\": callback,\n        \"isMovementUp\": isMovementUp,\n        \"dtop\": dtop,\n        \"yMovement\": getYmovement(getState().activeSection, element),\n        \"anchorLink\": section.anchor,\n        \"sectionIndex\": section.index(),\n        \"activeSlide\": section.activeSlide ? section.activeSlide.item : null,\n        \"leavingSection\": getState().activeSection.index() + 1,\n        //caching the value of isResizing at the momment the function is called\n        //because it will be checked later inside a setTimeout and the value might change\n        \"localIsResizing\": state.isResizing,\n        \"items\": {\n          \"origin\": getState().activeSection,\n          \"destination\": section\n        },\n        \"direction\": null\n      }; //quiting when destination scroll is the same as the current one\n\n      if (getState().activeSection.item == element && !state.isResizing || getOptions().scrollBar && getScrollTop() === v.dtop && !hasClass(element, AUTO_HEIGHT)) {\n        return;\n      }\n\n      if (v.activeSlide != null) {\n        slideAnchorLink = getAttr(v.activeSlide, 'data-anchor');\n        slideIndex = index(v.activeSlide, null);\n      } //callback (onLeave) if the site is not just resizing and readjusting the slides\n\n\n      if (!v.localIsResizing) {\n        var direction = v.yMovement; //required for continousVertical\n\n        if (typeof isMovementUp !== 'undefined') {\n          direction = isMovementUp ? 'up' : 'down';\n        } //for the callback\n\n\n        v.direction = direction;\n\n        if (isFunction(getOptions().beforeLeave)) {\n          if (fireCallbackOncePerScroll('beforeLeave', v) === false) {\n            return;\n          }\n        }\n\n        if (isFunction(getOptions().onLeave)) {\n          if (!fireCallback('onLeave', v)) {\n            return;\n          }\n        }\n      } // If continuousVertical && we need to wrap around\n\n\n      if (getOptions().autoScrolling && getOptions().continuousVertical && typeof v.isMovementUp !== \"undefined\" && (!v.isMovementUp && v.yMovement == 'up' || // Intending to scroll down but about to go up or\n      v.isMovementUp && v.yMovement == 'down')) {\n        // intending to scroll up but about to go down\n        v = createInfiniteSections(v);\n      } //pausing media of the leaving section (if we are not just resizing, as destinatino will be the same one)\n\n\n      if (!v.localIsResizing) {\n        stopMedia(getState().activeSection.item);\n      }\n\n      addClass(element, ACTIVE);\n      removeClass(siblings(element), ACTIVE);\n      updateState();\n      lazyLoad(element); //preventing from activating the MouseWheelHandler event\n      //more than once if the page is scrolling\n\n      setState({\n        canScroll: FP.test.isTesting\n      });\n      setPageStatus(slideIndex, slideAnchorLink, v.anchorLink);\n      EventEmitter.emit(events.onLeave, v);\n      performMovement(v); //flag to avoid callingn `scrollPage()` twice in case of using anchor links\n\n      setState({\n        lastScrolledDestiny: v.anchorLink\n      }); //avoid firing it twice (as it does also on scroll)\n\n      activateMenuAndNav(v.anchorLink, v.sectionIndex);\n    }\n\n    function onDestroy$8() {\n      clearTimeout(g_afterSectionLoadsId);\n      clearTimeout(g_transitionLapseId);\n    }\n    /**\n    * Returns the destination Y position based on the scrolling direction and\n    * the height of the section.\n    */\n\n\n    function getDestinationPosition(element) {\n      var elementHeight = element.offsetHeight;\n      var elementTop = element.offsetTop; //top of the desination will be at the top of the viewport\n\n      var position = elementTop;\n      var isScrollingDown = elementTop > state.previousDestTop;\n      var sectionBottom = position - getWindowHeight() + elementHeight;\n      var bigSectionsDestination = getOptions().bigSectionsDestination; //is the destination element bigger than the viewport?\n\n      if (elementHeight > getWindowHeight()) {\n        //scrolling up?\n        if (!isScrollingDown && !bigSectionsDestination || bigSectionsDestination === 'bottom') {\n          position = sectionBottom;\n        }\n      } //sections equal or smaller than the viewport height && scrolling down? ||  is resizing and its in the last section\n      else if (isScrollingDown || state.isResizing && next(element) == null) {\n        //The bottom of the destination will be at the bottom of the viewport\n        position = sectionBottom;\n      }\n      /*\n      Keeping record of the last scrolled position to determine the scrolling direction.\n      No conventional methods can be used as the scroll bar might not be present\n      AND the section might not be active if it is auto-height and didnt reach the middle\n      of the viewport.\n      */\n\n\n      setState({\n        previousDestTop: position\n      });\n      return position;\n    }\n    /**\n    * Performs the vertical movement (by CSS3 or by jQuery)\n    */\n\n\n    function performMovement(v) {\n      var isFastSpeed = getOptions().scrollingSpeed < 700;\n      var transitionLapse = isFastSpeed ? 700 : getOptions().scrollingSpeed;\n      setState({\n        touchDirection: 'none',\n        scrollY: Math.round(v.dtop)\n      });\n      EventEmitter.emit(events.onPerformMovement); // using CSS3 translate functionality\n\n      if (getOptions().css3 && getOptions().autoScrolling && !getOptions().scrollBar) {\n        // The first section can have a negative value in iOS 10. Not quite sure why: -0.0142822265625\n        // that's why we round it to 0.\n        var translate3d = 'translate3d(0px, -' + Math.round(v.dtop) + 'px, 0px)';\n        transformContainer(translate3d, true); //even when the scrollingSpeed is 0 there's a little delay, which might cause the\n        //scrollingSpeed to change in case of using silentMoveTo();ç\n\n        if (getOptions().scrollingSpeed) {\n          clearTimeout(g_afterSectionLoadsId);\n          g_afterSectionLoadsId = setTimeout(function () {\n            afterSectionLoads$1(v); //disabling canScroll when using fastSpeed\n\n            setState({\n              canScroll: !isFastSpeed || FP.test.isTesting\n            });\n          }, getOptions().scrollingSpeed);\n        } else {\n          afterSectionLoads$1(v);\n        }\n      } // using JS to animate\n      else {\n        var scrollSettings = getScrollSettings(v.dtop);\n        FP.test.top = -v.dtop + 'px';\n        clearTimeout(g_afterSectionLoadsId);\n        scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function () {\n          if (getOptions().scrollBar) {\n            /* Hack!\n            The timeout prevents setting the most dominant section in the viewport as \"active\" when the user\n            scrolled to a smaller section by using the mousewheel (auto scrolling) rather than draging the scroll bar.\n             When using scrollBar:true It seems like the scroll events still getting propagated even after the scrolling animation has finished.\n            */\n            g_afterSectionLoadsId = setTimeout(function () {\n              afterSectionLoads$1(v);\n            }, 30);\n          } else {\n            afterSectionLoads$1(v); //disabling canScroll when using fastSpeed\n\n            setState({\n              canScroll: !isFastSpeed || FP.test.isTesting\n            });\n          }\n        });\n      } // enabling canScroll after the minimum transition laps\n\n\n      if (isFastSpeed) {\n        clearTimeout(g_transitionLapseId);\n        g_transitionLapseId = setTimeout(function () {\n          setState({\n            canScroll: true\n          });\n        }, transitionLapse);\n      }\n    }\n    /**\n    * Actions to do once the section is loaded.\n    */\n\n\n    function afterSectionLoads$1(v) {\n      setState({\n        isBeyondFullpage: false\n      });\n      continuousVerticalFixSectionOrder(v); //callback (afterLoad) if the site is not just resizing and readjusting the slides\n\n      if (isFunction(getOptions().afterLoad) && !v.localIsResizing) {\n        fireCallback('afterLoad', v);\n      }\n\n      updateState();\n\n      if (!v.localIsResizing) {\n        playMedia(v.element);\n      }\n\n      addClass(v.element, COMPLETELY);\n      removeClass(siblings(v.element), COMPLETELY);\n      lazyLoadOthers();\n      setState({\n        canScroll: true\n      });\n      EventEmitter.emit(events.afterSectionLoads, v);\n\n      if (isFunction(v.callback)) {\n        v.callback();\n      }\n    }\n\n    FP.setFitToSection = setFitToSection;\n    FP.fitToSection = fitToSection;\n    /**\n    * Sets fitToSection\n    */\n\n    function setFitToSection(value, type) {\n      setVariableState('fitToSection', value, type);\n    }\n    /**\n    * Fits the site to the nearest active section\n    */\n\n    function fitToSection() {\n      //checking fitToSection again in case it was set to false before the timeout delay\n      if (state.canScroll) {\n        //allows to scroll to an active section and\n        //if the section is already active, we prevent firing callbacks\n        setState({\n          isResizing: true\n        });\n        scrollPage(state.activeSection);\n        setState({\n          isResizing: false\n        });\n      }\n    }\n\n    FP.setResponsive = setResponsive;\n    /**\n    * Checks if the site needs to get responsive and disables autoScrolling if so.\n    * A class `fp-responsive` is added to the plugin's container in case the user wants to use it for his own responsive CSS.\n    */\n\n    function responsive() {\n      var widthLimit = getOptions().responsive || getOptions().responsiveWidth; //backwards compatiblity\n\n      var heightLimit = getOptions().responsiveHeight; //only calculating what we need. Remember its called on the resize event.\n\n      var isBreakingPointWidth = widthLimit && win.innerWidth < widthLimit;\n      var isBreakingPointHeight = heightLimit && win.innerHeight < heightLimit;\n\n      if (widthLimit && heightLimit) {\n        setResponsive(isBreakingPointWidth || isBreakingPointHeight);\n      } else if (widthLimit) {\n        setResponsive(isBreakingPointWidth);\n      } else if (heightLimit) {\n        setResponsive(isBreakingPointHeight);\n      }\n    }\n    /**\n    * Turns fullPage.js to normal scrolling mode when the viewport `width` or `height`\n    * are smaller than the set limit values.\n    */\n\n    function setResponsive(active) {\n      var isResponsive = isResponsiveMode();\n\n      if (active) {\n        if (!isResponsive) {\n          setAutoScrolling(false, 'internal');\n          setFitToSection(false, 'internal');\n          hide($(SECTION_NAV_SEL));\n          addClass($body, RESPONSIVE);\n\n          if (isFunction(getOptions().afterResponsive)) {\n            getOptions().afterResponsive.call(getContainer(), active);\n          }\n        }\n      } else if (isResponsive) {\n        setAutoScrolling(getOriginals().autoScrolling, 'internal');\n        setFitToSection(getOriginals().autoScrolling, 'internal');\n        show($(SECTION_NAV_SEL));\n        removeClass($body, RESPONSIVE);\n\n        if (isFunction(getOptions().afterResponsive)) {\n          getOptions().afterResponsive.call(getContainer(), active);\n        }\n      }\n    }\n    /**\n    * Determines whether fullpage.js is in responsive mode or not.\n    */\n\n\n    function isResponsiveMode() {\n      return hasClass($body, RESPONSIVE);\n    }\n\n    function addTableClass(element) {\n      if (!getOptions().verticalCentered) {\n        return;\n      } // Overflowing sections when scrollOverflow is disabled will be autoHeight\n      // and won't require vertical aligment\n\n\n      if (!getOptions().scrollOverflow && scrollOverflowHandler.shouldBeScrollable(element.item)) {\n        return;\n      }\n\n      if (!scrollOverflowHandler.isScrollable(element)) {\n        //In case we are styling for the 2nd time as in with reponsiveSlides\n        if (!hasClass(element.item, TABLE)) {\n          addClass(element.item, TABLE);\n        }\n      }\n    }\n\n    var startingSection = null;\n    FP.getActiveSection = getActiveSection;\n    function getStartingSection() {\n      return startingSection;\n    }\n    /**\n    * Styling vertical sections\n    */\n\n    function styleSection(section) {\n      var sectionElem = section.item;\n      var hasSlides = section.allSlidesItems.length;\n      var index = section.index(); //if no active section is defined, the 1st one will be the default one\n\n      if (!getState().activeSection && section.isVisible) {\n        addClass(sectionElem, ACTIVE);\n        updateState();\n        startingSection = getState().activeSection.item;\n      }\n\n      if (getOptions().paddingTop) {\n        css(sectionElem, {\n          'padding-top': getOptions().paddingTop\n        });\n      }\n\n      if (getOptions().paddingBottom) {\n        css(sectionElem, {\n          'padding-bottom': getOptions().paddingBottom\n        });\n      }\n\n      if (typeof getOptions().sectionsColor[index] !== 'undefined') {\n        css(sectionElem, {\n          'background-color': getOptions().sectionsColor[index]\n        });\n      }\n\n      if (typeof getOptions().anchors[index] !== 'undefined') {\n        sectionElem.setAttribute('data-anchor', section.anchor);\n      }\n\n      if (!hasSlides) {\n        addTableClass(section);\n      }\n    }\n    /**\n    * Gets the active section.\n    */\n\n    function getActiveSection() {\n      return getState().activeSection;\n    }\n\n    function getSectionFromPanel(panel) {\n      return panel.isSection ? panel : panel.parent;\n    }\n\n    var g_focusScrollableId;\n    EventEmitter.on(events.bindEvents, bindEvents$b);\n\n    function bindEvents$b() {\n      // We can't focus scrollOverflow before scrolling\n      // to the anchor (if we need to)\n      EventEmitter.on(events.onAfterRenderNoAnchor, afterRender);\n      EventEmitter.on(events.onLeave, scrollOverflowHandler.onLeave);\n      EventEmitter.on(events.onSlideLeave, scrollOverflowHandler.onLeave);\n      EventEmitter.on(events.afterSlideLoads, scrollOverflowHandler.afterLoad);\n      EventEmitter.on(events.afterSectionLoads, scrollOverflowHandler.afterLoad);\n      EventEmitter.on(events.onDestroy, onDestroy$7);\n      docAddEvent('keyup', scrollOverflowHandler.keyUpHandler);\n    }\n\n    function afterRender() {\n      if (getOptions().scrollOverflow && !getOptions().scrollBar) {\n        scrollOverflowHandler.makeScrollable();\n        scrollOverflowHandler.focusScrollable();\n      }\n    }\n\n    function onDestroy$7() {\n      EventEmitter.removeListener(events.onAfterRenderNoAnchor, afterRender);\n      docRemoveEvent('keyup', scrollOverflowHandler.keyUpHandler);\n    }\n\n    var scrollOverflowHandler = {\n      focusedElem: null,\n      shouldFocusScrollable: true,\n      isInnerScrollAllowed: true,\n      timeBeforeReachingLimit: null,\n      timeLastScroll: null,\n      preventScrollWithMouseWheel: function preventScrollWithMouseWheel(e) {\n        if (!state.canScroll) {\n          preventDefault(e);\n          return false;\n        }\n      },\n      preventScrollWithKeyboard: function preventScrollWithKeyboard(e) {\n        if (!isInsideInput() && getOptions().keyboardScrolling) {\n          var directionKeys = [38, 33, 32, 40, 34, 36, 35];\n\n          if (directionKeys.indexOf(e.keyCode) > -1 && !scrollOverflowHandler.isInnerScrollAllowed) {\n            preventDefault(e);\n            return false;\n          }\n        }\n      },\n      keyUpHandler: function keyUpHandler() {\n        scrollOverflowHandler.shouldFocusScrollable = state.canScroll;\n      },\n      // Leaving sections or slides\n      onLeave: function onLeave() {\n        clearTimeout(g_focusScrollableId);\n        scrollOverflowHandler.isInnerScrollAllowed = false;\n      },\n      // Loading sections or slides\n      afterLoad: function afterLoad() {\n        scrollOverflowHandler.isInnerScrollAllowed = false; // Delaying it to avoid issues on Safari when focusing elements #4484 & #4493\n\n        clearTimeout(g_focusScrollableId);\n        g_focusScrollableId = setTimeout(function () {\n          scrollOverflowHandler.shouldFocusScrollable = state.canScroll;\n        }, 200);\n      },\n      // Unfocusing the scrollable element from the orgin section/slide\n      unfocusScrollable: function unfocusScrollable() {\n        if (doc.activeElement === this.focusedElem) {\n          // @ts-ignore\n          this.focusedElem.blur();\n          scrollOverflowHandler.isInnerScrollAllowed = false;\n        }\n      },\n      focusScrollable: function focusScrollable() {\n        if (!getOptions().scrollOverflow || !scrollOverflowHandler.shouldFocusScrollable) {\n          return;\n        }\n\n        scrollOverflowHandler.unfocusScrollable();\n        var scrollableItem = scrollOverflowHandler.getScrollableItem(getState().activeSection.item); // On desktop we focus the scrollable to be able to use the mouse wheel\n        // We avoid it on mobile due to a bug in iOS Safari\n\n        if (scrollableItem && !isTouchDevice && !isTouch) {\n          this.focusedElem = scrollableItem; // Forcing the focus on the next paint \n          // to avoid issue #4484 & #4493 on Safari\n\n          requestAnimationFrame(function () {\n            scrollableItem.focus();\n            scrollOverflowHandler.isInnerScrollAllowed = true;\n          });\n        }\n\n        scrollOverflowHandler.shouldFocusScrollable = false;\n      },\n      makeScrollable: function makeScrollable() {\n        if (getOptions().scrollOverflowMacStyle && !isMacDevice) {\n          addClass($body, 'fp-scroll-mac');\n        }\n\n        getState().panels.forEach(function (el) {\n          if (el.slides && el.slides.length) {\n            return;\n          }\n\n          if (hasClass(el.item, AUTO_HEIGHT_RESPONSIVE) && isResponsiveMode()) {\n            return;\n          } else {\n            var item = getSlideOrSection(el.item);\n            var shouldBeScrollable = scrollOverflowHandler.shouldBeScrollable(el.item);\n            var section = getSectionFromPanel(el);\n\n            if (isIE11) {\n              var toggleAction = shouldBeScrollable ? 'addClass' : 'removeClass';\n              utils[toggleAction](section.item, IS_OVERFLOW);\n              utils[toggleAction](el.item, IS_OVERFLOW);\n            } else {\n              addClass(section.item, IS_OVERFLOW);\n              addClass(el.item, IS_OVERFLOW);\n            }\n\n            if (!el.hasScroll) {\n              scrollOverflowHandler.createWrapper(item);\n              scrollOverflowHandler.bindEvents(item);\n            } // updating the state now in case \n            // this is executed on page load (after images load)\n\n\n            el.hasScroll = true;\n          }\n        });\n      },\n      bindEvents: function bindEvents(item) {\n        scrollOverflowHandler.getScrollableItem(item).addEventListener('scroll', scrollOverflowHandler.onPanelScroll);\n        item.addEventListener('wheel', scrollOverflowHandler.preventScrollWithMouseWheel, {\n          passive: false\n        });\n        item.addEventListener('keydown', scrollOverflowHandler.preventScrollWithKeyboard, {\n          passive: false\n        });\n      },\n      createWrapper: function createWrapper(item) {\n        var overflowWrapper = document.createElement('div');\n        overflowWrapper.className = OVERFLOW;\n        wrapInner(item, overflowWrapper);\n        overflowWrapper.setAttribute('tabindex', '-1');\n      },\n      destroyWrapper: function destroyWrapper(item) {\n        var overflowWrapper = $(OVERFLOW_SEL, item)[0];\n\n        if (overflowWrapper) {\n          unwrap(overflowWrapper);\n          item.removeAttribute('tabindex');\n        }\n      },\n      getScrollableItem: function getScrollableItem(sectionItem) {\n        var panel = getSlideOrSection(sectionItem);\n        return $(OVERFLOW_SEL, panel)[0] || panel;\n      },\n      hasScroll: function hasScroll(panelItem) {\n        return hasClass(panelItem, OVERFLOW) || $(OVERFLOW_SEL, panelItem)[0] != null;\n      },\n      isScrollable: function isScrollable(panel) {\n        return panel.isSection && panel.activeSlide ? panel.activeSlide.hasScroll : panel.hasScroll;\n      },\n      shouldBeScrollable: function shouldBeScrollable(item) {\n        var scrollable = scrollOverflowHandler.getScrollableItem(item);\n        return scrollable.scrollHeight > win.innerHeight;\n      },\n      isScrolled: function isScrolled(direction, el) {\n        if (!state.canScroll) {\n          return false;\n        } // we won't allow scrolloverflow on scrollBar:true\n\n\n        if (getOptions().scrollBar) {\n          return true;\n        }\n\n        var scrollableItem = scrollOverflowHandler.getScrollableItem(el);\n\n        if (!getOptions().scrollOverflow || !hasClass(scrollableItem, OVERFLOW) || // Checking the section first \n        // In case they apply to both section + slide #4505\n        hasClass(el, 'fp-noscroll') || // Checking the slide (in case it has)\n        hasClass(getSlideOrSection(el), 'fp-noscroll')) {\n          return true;\n        } // ie11 wrongly calculates scrollHeight when using the CSS style\n        // overflow: auto   It adds 1 more pixel compared to offsetHeight\n\n\n        var ie11offset = isIE11 ? 1 : 0;\n        var positionY = scrollableItem.scrollTop;\n        var isTopReached = direction === 'up' && positionY <= 0;\n        var isBottomReached = direction === 'down' && scrollableItem.scrollHeight <= Math.ceil(scrollableItem.offsetHeight + positionY) + ie11offset;\n        var isScrolled = isTopReached || isBottomReached;\n\n        if (!isScrolled) {\n          this.timeBeforeReachingLimit = new Date().getTime();\n        }\n\n        return isScrolled;\n      },\n      shouldMovePage: function shouldMovePage() {\n        this.timeLastScroll = new Date().getTime();\n        var timeDiff = this.timeLastScroll - scrollOverflowHandler.timeBeforeReachingLimit;\n        var isUsingTouch = isTouchDevice || isTouch;\n        var isGrabbing = isUsingTouch && state.isGrabbing;\n        var isNotFirstTimeReachingLimit = state.isUsingWheel && timeDiff > 600;\n        return isGrabbing && timeDiff > 400 || isNotFirstTimeReachingLimit;\n      },\n      onPanelScroll: function () {\n        var prevPosition = 0;\n        return function (e) {\n          var currentPosition = e.target.scrollTop;\n          var direction = state.touchDirection !== 'none' ? state.touchDirection : prevPosition < currentPosition ? 'down' : 'up';\n          prevPosition = currentPosition;\n\n          if (isFunction(getOptions().onScrollOverflow)) {\n            fireCallback('onScrollOverflow', {\n              position: currentPosition,\n              direction: direction\n            });\n          }\n\n          if (hasClass(e.target, OVERFLOW) && state.canScroll) {\n            if (scrollOverflowHandler.isScrolled(direction, e.target) && scrollOverflowHandler.shouldMovePage()) {\n              // Checking again if we have a scrollable content\n              // To avoid issues like #4479 where the scroll event gets\n              // triggered after removing/hidding content if this was scrolled\n              if (scrollOverflowHandler.shouldBeScrollable(getState().activeSection.item)) {\n                EventEmitter.emit(events.onScrollOverflowScrolled, {\n                  direction: direction\n                });\n              }\n            }\n          }\n        };\n      }()\n    };\n\n    var g_afterSlideLoadsId;\n    FP.landscapeScroll = landscapeScroll;\n    EventEmitter.on(events.bindEvents, bindEvents$a);\n\n    function bindEvents$a() {\n      EventEmitter.on(events.onPerformMovement, onPerformMovement);\n    }\n\n    function onPerformMovement() {\n      clearTimeout(g_afterSlideLoadsId);\n      setState({\n        slideMoving: false\n      });\n    }\n    /**\n    * Scrolls horizontal sliders.\n    */\n\n\n    function landscapeScroll(slides, destiny, direction) {\n      var sectionElem = closest(slides, SECTION_SEL);\n      var section = getState().sections.filter(function (section) {\n        return section.item == sectionElem;\n      })[0];\n      var slide = section.slides.filter(function (slide) {\n        return slide.item == destiny;\n      })[0];\n      var v = {\n        \"slides\": slides,\n        \"destiny\": destiny,\n        \"direction\": direction,\n        \"destinyPos\": {\n          \"left\": destiny.offsetLeft\n        },\n        \"slideIndex\": slide.index(),\n        \"section\": sectionElem,\n        \"sectionIndex\": section.index(),\n        \"anchorLink\": section.anchor,\n        \"slidesNav\": $(SLIDES_NAV_SEL, sectionElem)[0],\n        \"slideAnchor\": slide.anchor,\n        \"prevSlide\": section.activeSlide.item,\n        \"prevSlideIndex\": section.activeSlide.index(),\n        \"items\": {\n          \"section\": section,\n          \"origin\": section.activeSlide,\n          \"destination\": slide\n        },\n        //caching the value of isResizing at the momment the function is called\n        //because it will be checked later inside a setTimeout and the value might change\n        \"localIsResizing\": state.isResizing\n      };\n      v.xMovement = getXmovement(v.prevSlideIndex, v.slideIndex);\n      v.direction = v.direction ? v.direction : v.xMovement; //important!! Only do it when not resizing\n\n      if (!v.localIsResizing) {\n        //preventing from scrolling to the next/prev section when using scrollHorizontally\n        setState({\n          canScroll: false\n        });\n      }\n\n      if (getOptions().onSlideLeave) {\n        //if the site is not just resizing and readjusting the slides\n        if (!v.localIsResizing && v.xMovement !== 'none') {\n          if (isFunction(getOptions().onSlideLeave)) {\n            if (fireCallback('onSlideLeave', v) === false) {\n              setState({\n                slideMoving: false\n              });\n              return;\n            }\n          }\n        }\n      }\n\n      addClass(destiny, ACTIVE);\n      removeClass(siblings(destiny), ACTIVE);\n      updateState();\n\n      if (!v.localIsResizing) {\n        stopMedia(v.prevSlide);\n        lazyLoad(destiny);\n      }\n\n      toggleControlArrows(v); //only changing the URL if the slides are in the current section (not for resize re-adjusting)\n\n      if (section.isActive && !v.localIsResizing) {\n        setPageStatus(v.slideIndex, v.slideAnchor, v.anchorLink);\n      }\n\n      EventEmitter.emit(events.onSlideLeave, v);\n      performHorizontalMove(slides, v, true);\n    }\n    /**\n    * Performs the horizontal movement. (CSS3 or jQuery)\n    *\n    * @param fireCallback {Boolean} - determines whether or not to fire the callback\n    */\n\n    function performHorizontalMove(slides, v, fireCallback) {\n      var destinyPos = v.destinyPos;\n      activeSlidesNavigation(v.slidesNav, v.slideIndex);\n      setState({\n        scrollX: Math.round(destinyPos.left)\n      });\n\n      if (getOptions().css3) {\n        var translate3d = 'translate3d(-' + Math.round(destinyPos.left) + 'px, 0px, 0px)';\n        FP.test.translate3dH[v.sectionIndex] = translate3d;\n        css(addAnimation($(SLIDES_CONTAINER_SEL, slides)), getTransforms(translate3d));\n        clearTimeout(g_afterSlideLoadsId);\n        g_afterSlideLoadsId = setTimeout(function () {\n          if (fireCallback) {\n            afterSlideLoads(v);\n          }\n        }, getOptions().scrollingSpeed);\n      } else {\n        FP.test.left[v.sectionIndex] = Math.round(destinyPos.left);\n        scrollTo(slides, Math.round(destinyPos.left), getOptions().scrollingSpeed, function () {\n          if (fireCallback) {\n            afterSlideLoads(v);\n          }\n        });\n      }\n    }\n    /**\n    * Retuns `right` or `left` depending on the scrolling movement to reach its destination\n    * from the current slide.\n    */\n\n\n    function getXmovement(fromIndex, toIndex) {\n      if (fromIndex == toIndex) {\n        return 'none';\n      }\n\n      if (fromIndex > toIndex) {\n        return 'left';\n      }\n\n      return 'right';\n    }\n\n    function onDestroy$6() {\n      clearTimeout(g_afterSlideLoadsId);\n    }\n\n    function afterSlideLoads(v) {\n      //if the site is not just resizing and readjusting the slides\n      if (!v.localIsResizing) {\n        if (isFunction(getOptions().afterSlideLoad)) {\n          fireCallback('afterSlideLoad', v);\n        } //needs to be inside the condition to prevent problems with continuousVertical and scrollHorizontally\n        //and to prevent double scroll right after a windows resize\n\n\n        setState({\n          canScroll: true\n        });\n        playMedia(v.destiny);\n        EventEmitter.emit(events.afterSlideLoads, v);\n      } //letting them slide again\n\n\n      setState({\n        slideMoving: false\n      });\n    }\n\n    /**\n    * Slides silently (with no animation) the active slider to the given slide.\n    * @param noCallback {bool} true or defined -> no callbacks\n    */\n\n    function silentLandscapeScroll(activeSlide, noCallbacks) {\n      setScrollingSpeed(0, 'internal');\n\n      if (typeof noCallbacks !== 'undefined') {\n        //preventing firing callbacks afterSlideLoad etc.\n        setState({\n          isResizing: true\n        });\n      }\n\n      landscapeScroll(closest(activeSlide, SLIDES_WRAPPER_SEL), activeSlide);\n\n      if (typeof noCallbacks !== 'undefined') {\n        setState({\n          isResizing: false\n        });\n      }\n\n      setScrollingSpeed(getOriginals().scrollingSpeed, 'internal');\n    }\n\n    var g_prevActiveSectionIndex = null;\n    var g_prevActiveSlideIndex = null;\n    /** \n     * Updates the state of the app.\n     */\n\n    function updateState() {\n      state.activeSection = null;\n      state.sections.map(function (section) {\n        var isActive = hasClass(section.item, ACTIVE);\n        section.isActive = isActive;\n        section.hasScroll = scrollOverflowHandler.hasScroll(section.item);\n\n        if (isActive) {\n          state.activeSection = section;\n        }\n\n        if (section.slides.length) {\n          section.activeSlide = null;\n          section.slides.map(function (slide) {\n            var isActiveSlide = hasClass(slide.item, ACTIVE);\n            slide.hasScroll = scrollOverflowHandler.hasScroll(section.item);\n            slide.isActive = isActiveSlide;\n\n            if (isActiveSlide) {\n              section.activeSlide = slide;\n            }\n          });\n        }\n      });\n      scrollToNewActivePanel();\n    }\n    function updateStructuralState() {\n      var allSectionItems = $(getOptions().sectionSelector, getContainer());\n      var sectionsItems = getVisible(allSectionItems);\n      var allSections = Array.from(allSectionItems).map(function (item) {\n        return new SectionPanel(item);\n      });\n      var sections = allSections.filter(function (item) {\n        return item.isVisible;\n      });\n      var slides = sections.reduce(function (acc, section) {\n        return acc.concat(section.slides);\n      }, []); // keeping track of the previously active section\n\n      g_prevActiveSectionIndex = getPrevActivePanelIndex(state.activeSection);\n      g_prevActiveSlideIndex = getPrevActivePanelIndex(state.activeSection ? state.activeSection.activeSlide : null);\n      state.numSections = sectionsItems.length;\n      state.numSlides = sections.reduce(function (acc, section) {\n        return acc + section.slides.length;\n      }, 0);\n      state.sections = sections;\n      state.sectionsIncludingHidden = allSections;\n      state.slides = slides;\n      state.panels = state.sections.concat(state.slides);\n    }\n\n    function getPrevActivePanelIndex(activePanel) {\n      if (!activePanel) {\n        return null;\n      }\n\n      var prevActivePanelItem = activePanel ? activePanel.item : null;\n      var hiddenPanels = activePanel.isSection ? state.sectionsIncludingHidden : state.activeSection.slidesIncludingHidden;\n\n      if (prevActivePanelItem) {\n        var panel = getPanelByElement(hiddenPanels, prevActivePanelItem);\n        return panel ? panel.index() : null;\n      }\n\n      return null;\n    }\n    /**\n     * When changes in the DOM take place there's a change \n     * the active section is now hidden or removed. \n     * fullPage.js will scroll to the closest section nearby.\n     */\n\n\n    function scrollToNewActivePanel() {\n      var activeSection = state.activeSection;\n      var activeSectionHasSlides = state.activeSection ? state.activeSection.slides.length : false;\n      var activeSlide = state.activeSection ? state.activeSection.activeSlide : null; // Hidding / removing the active section ?\n\n      if (!activeSection && state.sections.length && !getState().isBeyondFullpage && g_prevActiveSectionIndex) {\n        var newActiveSection = getNewActivePanel(g_prevActiveSectionIndex, state.sections);\n\n        if (newActiveSection) {\n          state.activeSection = newActiveSection;\n          state.activeSection.isActive = true;\n          addClass(state.activeSection.item, ACTIVE);\n        }\n\n        if (state.activeSection) {\n          silentScroll(state.activeSection.item.offsetTop);\n        }\n      }\n\n      if (activeSectionHasSlides && !activeSlide && g_prevActiveSlideIndex) {\n        var newActiveSlide = getNewActivePanel(g_prevActiveSlideIndex, state.activeSection.slides);\n\n        if (newActiveSlide) {\n          state.activeSection.activeSlide = newActiveSlide;\n          state.activeSection.activeSlide.isActive = true;\n          addClass(state.activeSection.activeSlide.item, ACTIVE);\n        }\n\n        if (state.activeSection.activeSlide) {\n          silentLandscapeScroll(state.activeSection.activeSlide.item, 'internal');\n        }\n      }\n    }\n\n    function getNewActivePanel(prevActivePanelIndex, siblings) {\n      var newActiveSection;\n      var prevIndex = prevActivePanelIndex - 1;\n      var nextIndex = prevActivePanelIndex;\n\n      do {\n        newActiveSection = siblings[prevIndex] || siblings[nextIndex];\n\n        if (newActiveSection) {\n          break;\n        }\n\n        prevIndex = prevIndex - 1;\n        nextIndex = nextIndex + 1;\n      } while (prevIndex >= 0 || nextIndex < siblings.length);\n\n      return newActiveSection;\n    }\n    /**\n    * Section object\n    */\n\n\n    var SectionPanel = function SectionPanel(el) {\n      var _this = this;\n\n      [].push.call(arguments, getOptions().sectionSelector);\n      Item.apply(this, arguments);\n      this.allSlidesItems = $(getOptions().slideSelector, el);\n      this.slidesIncludingHidden = Array.from(this.allSlidesItems).map(function (item) {\n        return new SlidePanel(item, _this);\n      });\n      this.slides = this.slidesIncludingHidden.filter(function (slidePanel) {\n        return slidePanel.isVisible;\n      });\n      this.activeSlide = this.slides.length ? this.slides.filter(function (slide) {\n        return slide.isActive;\n      })[0] || this.slides[0] : null;\n    };\n    SectionPanel.prototype = Item.prototype;\n    SectionPanel.prototype.constructor = SectionPanel;\n    /**\n    * Slide object\n    */\n\n    var SlidePanel = function SlidePanel(el, section) {\n      this.parent = section;\n      Item.call(this, el, getOptions().slideSelector);\n    };\n\n    SlidePanel.prototype = Item.prototype;\n    SlidePanel.prototype.constructor = SectionPanel;\n\n    /**\n    * Adds internal classes to be able to provide customizable selectors\n    * keeping the link with the style sheet.\n    */\n\n    function addInternalSelectors() {\n      addClass($(getOptions().sectionSelector, getContainer()), SECTION);\n      addClass($(getOptions().slideSelector, getContainer()), SLIDE);\n    }\n\n    /**\n    * Styles the horizontal slides for a section.\n    */\n\n    function styleSlides(section) {\n      var numSlides = section.slides.length;\n      var slidesElems = section.allSlidesItems;\n      var slides = section.slides;\n      var sliderWidth = numSlides * 100;\n      var slideWidth = 100 / numSlides;\n\n      if (!$(SLIDES_WRAPPER_SEL, section.item)[0]) {\n        var slidesWrapper = doc.createElement('div');\n        slidesWrapper.className = SLIDES_WRAPPER; //fp-slides\n\n        wrapAll(slidesElems, slidesWrapper);\n        var slidesContainer = doc.createElement('div');\n        slidesContainer.className = SLIDES_CONTAINER; //fp-slidesContainer\n\n        wrapAll(slidesElems, slidesContainer);\n      }\n\n      css($(SLIDES_CONTAINER_SEL, section.item), {\n        'width': sliderWidth + '%'\n      });\n\n      if (numSlides > 1) {\n        if (getOptions().controlArrows) {\n          createSlideArrows(section);\n        }\n\n        if (getOptions().slidesNavigation) {\n          addSlidesNavigation(section);\n        }\n      }\n\n      slides.forEach(function (slide) {\n        css(slide.item, {\n          'width': slideWidth + '%'\n        });\n\n        if (getOptions().verticalCentered) {\n          addTableClass(slide);\n        }\n      });\n      var startingSlide = section.activeSlide || null; //if the slide won't be an starting point, the default will be the first one\n      //the active section isn't the first one? Is not the first slide of the first section? Then we load that section/slide by default.\n\n      if (startingSlide != null && state.activeSection && (state.activeSection.index() !== 0 || state.activeSection.index() === 0 && startingSlide.index() !== 0)) {\n        silentLandscapeScroll(startingSlide.item, 'internal');\n      } else {\n        addClass(slidesElems[0], ACTIVE);\n      }\n    }\n\n    var g_wrapperObserver;\n    var g_wrapperObserveConfig = {\n      attributes: false,\n      subtree: true,\n      childList: true,\n      characterData: true\n    };\n    EventEmitter.on(events.bindEvents, bindEvents$9);\n    FP[\"render\"] = onContentChange;\n\n    function bindEvents$9() {\n      if (getOptions().observer && \"MutationObserver\" in window && $(WRAPPER_SEL)[0]) {\n        g_wrapperObserver = createObserver($(WRAPPER_SEL)[0], onContentChange, g_wrapperObserveConfig);\n      }\n\n      EventEmitter.on(events.contentChanged, onContentChange);\n    }\n    /**\n     * Creates a Mutation observer.\n     */\n\n\n    function createObserver(target, callback, config) {\n      var observer = new MutationObserver(callback);\n      observer.observe(target, config);\n      return observer;\n    }\n\n    function didSlidesChange() {\n      return getVisible($(getOptions().slideSelector, getContainer())).length !== getState().numSlides;\n    }\n\n    function didSectionsChange() {\n      return getVisible($(getOptions().sectionSelector, getContainer())).length !== getState().numSections;\n    }\n\n    function didSectionsOrSlidesChange() {\n      return didSlidesChange() || didSectionsChange();\n    }\n    /**\n     * Listen to changes on sections and fires reBuild\n     * when those changes affect the section height.\n     */\n\n\n    function onContentChange(mutations) {\n      var _didSlidesChange = didSlidesChange();\n\n      if (didSectionsOrSlidesChange() && !state.isDoingContinousVertical) {\n        if (getOptions().observer && g_wrapperObserver) {\n          // Temporally disabling the observer while \n          // we modidy the DOM again\n          g_wrapperObserver.disconnect();\n        }\n\n        updateStructuralState();\n        updateState(); // Removing navs and anchors options\n\n        getOptions().anchors = [];\n        remove($(SECTION_NAV_SEL));\n        addInternalSelectors();\n        setOptionsFromDOM();\n\n        if (getOptions().navigation) {\n          addVerticalNavigation();\n        }\n\n        if (_didSlidesChange) {\n          remove($(SLIDES_NAV_SEL));\n          remove($(SLIDES_ARROW_SEL));\n        }\n\n        getState().sections.forEach(function (section) {\n          if (section.slides.length) {\n            if (_didSlidesChange) {\n              styleSlides(section);\n            }\n          } else {\n            styleSection(section);\n          }\n        });\n      }\n\n      if (getOptions().observer && g_wrapperObserver && $(WRAPPER_SEL)[0]) {\n        g_wrapperObserver.observe($(WRAPPER_SEL)[0], g_wrapperObserveConfig);\n      }\n    }\n\n    var supportsPassiveEvents = function () {\n      //cheks for passive event support\n      var g_supportsPassive = false;\n\n      try {\n        var opts = Object.defineProperty({}, 'passive', {\n          get: function get() {\n            g_supportsPassive = true;\n          }\n        });\n        windowAddEvent(\"testPassive\", null, opts);\n        windowRemoveEvent(\"testPassive\", null, opts);\n      } catch (e) {}\n\n      return function () {\n        return g_supportsPassive;\n      };\n    }();\n\n    function getPassiveOptionsIfPossible() {\n      return supportsPassiveEvents() ? {\n        passive: false\n      } : false;\n    }\n\n    var wheelDataHandler = function () {\n      var _prevTime = new Date().getTime();\n\n      var _scrollings = [];\n      var isScrollingVertically;\n      var direction;\n      return {\n        registerEvent: function registerEvent(e) {\n          e = e || win.event;\n          var value = e.wheelDelta || -e.deltaY || -e.detail;\n          var delta = Math.max(-1, Math.min(1, value));\n          var horizontalDetection = typeof e.wheelDeltaX !== 'undefined' || typeof e.deltaX !== 'undefined';\n          isScrollingVertically = Math.abs(e.wheelDeltaX) < Math.abs(e.wheelDelta) || Math.abs(e.deltaX) < Math.abs(e.deltaY) || !horizontalDetection;\n          var curTime = new Date().getTime();\n          direction = delta < 0 ? 'down' : 'up'; //Limiting the array to 150 (lets not waste memory!)\n\n          if (_scrollings.length > 149) {\n            _scrollings.shift();\n          } //keeping record of the previous scrollings\n\n\n          _scrollings.push(Math.abs(value)); //time difference between the last scroll and the current one\n\n\n          var timeDiff = curTime - _prevTime;\n          _prevTime = curTime; //haven't they scrolled in a while?\n          //(enough to be consider a different scrolling action to scroll another section)\n\n          if (timeDiff > 200) {\n            //emptying the array, we dont care about old scrollings for our averages\n            _scrollings = [];\n          }\n        },\n        isAccelerating: function isAccelerating() {\n          var averageEnd = getAverage(_scrollings, 10);\n          var averageMiddle = getAverage(_scrollings, 70);\n          var isAccelerating = averageEnd >= averageMiddle;\n          return _scrollings.length ? isAccelerating && isScrollingVertically : false;\n        },\n        getDirection: function getDirection() {\n          return direction;\n        }\n      };\n    }();\n\n    function scrollBeyondFullPage() {\n      var dtop = getDestinationOffset();\n      var scrollSettings = getScrollSettings(dtop);\n      FP.test.top = -dtop + 'px';\n      setState({\n        canScroll: false\n      });\n      scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function () {\n        setTimeout(function () {\n          setState({\n            isBeyondFullpage: true\n          });\n          setState({\n            canScroll: true\n          });\n        }, 30);\n      });\n    }\n    function onKeyDown() {\n      if (!isFullPageAbove()) {\n        return;\n      } else {\n        scrollUpToFullpage();\n      }\n    }\n    function scrollUpToFullpage() {\n      var scrollSettings = getScrollSettings(getLast(getState().sections).item.offsetTop);\n      setState({\n        canScroll: false\n      });\n      scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function () {\n        setState({\n          canScroll: true\n        });\n        setState({\n          isBeyondFullpage: false\n        });\n        setState({\n          isAboutToScrollToFullPage: false\n        });\n      });\n    }\n\n    function getDestinationOffset() {\n      if (!getOptions().css3) {\n        return getLast(getState().sections).item.offsetTop + getLast(getState().sections).item.offsetHeight;\n      }\n\n      return getScrollTop() + getWindowHeight();\n    }\n\n    function beyondFullPageHandler(container, e) {\n      new Date().getTime();\n      var pauseScroll = getState().isBeyondFullpage && container.getBoundingClientRect().bottom >= 0 && wheelDataHandler.getDirection() === 'up';\n      var g_isAboutToScrollToFullPage = getState().isAboutToScrollToFullPage;\n\n      if (g_isAboutToScrollToFullPage) {\n        preventDefault(e);\n        return false;\n      }\n\n      if (getState().isBeyondFullpage) {\n        if (!pauseScroll) {\n          keyframeTime('set', 'beyondFullpage', 1000);\n        } else {\n          var shouldSetFixedPosition = !g_isAboutToScrollToFullPage && (!keyframeTime('isNewKeyframe', 'beyondFullpage') || !wheelDataHandler.isAccelerating());\n          var scrollSettings;\n\n          if (shouldSetFixedPosition) {\n            scrollSettings = getScrollSettings(getLast(getState().sections).item.offsetTop + getLast(getState().sections).item.offsetHeight);\n            scrollSettings.element.scrollTo(0, scrollSettings.options);\n            setState({\n              isAboutToScrollToFullPage: false\n            });\n            preventDefault(e);\n            return false;\n          } else if (wheelDataHandler.isAccelerating()) {\n            pauseScroll = false;\n            setState({\n              isAboutToScrollToFullPage: true\n            });\n            setState({\n              scrollTrigger: 'wheel'\n            });\n            scrollUpToFullpage();\n            preventDefault(e);\n            return false;\n          }\n        }\n\n        if (!g_isAboutToScrollToFullPage) {\n          // allow normal scrolling, but quitting\n          if (!pauseScroll) {\n            return true;\n          }\n        }\n      }\n    }\n\n    var keyframeTime = function () {\n      var isNew = false;\n      var frames = {};\n      var timeframes = {};\n      return function (action, name, timeframe) {\n        switch (action) {\n          case 'set':\n            frames[name] = new Date().getTime();\n            timeframes[name] = timeframe;\n            break;\n\n          case 'isNewKeyframe':\n            var current = new Date().getTime();\n            isNew = current - frames[name] > timeframes[name];\n            break;\n        }\n\n        return isNew;\n      };\n    }();\n\n    FP.moveSectionDown = moveSectionDown;\n    /**\n    * Moves the page down one section.\n    */\n\n    function moveSectionDown() {\n      var next = getState().activeSection.next(); //looping to the top if there's no more sections below\n\n      if (!next && (getOptions().loopBottom || getOptions().continuousVertical)) {\n        next = getState().sections[0];\n      }\n\n      if (next != null) {\n        scrollPage(next, null, false);\n      } else if (hasContentBeyondFullPage()) {\n        EventEmitter.emit(events.scrollBeyondFullpage);\n      }\n    }\n\n    function hasContentBeyondFullPage() {\n      return getContainer().scrollHeight < $body.scrollHeight && getOptions().scrollBar && getOptions().scrollBeyondFullpage;\n    }\n\n    FP.moveSectionUp = moveSectionUp;\n    /**\n    * Moves the page up one section.\n    */\n\n    function moveSectionUp() {\n      var prev = getState().activeSection.prev(); //looping to the bottom if there's no more sections above\n\n      if (!prev && (getOptions().loopTop || getOptions().continuousVertical)) {\n        prev = getLast(getState().sections);\n      }\n\n      if (prev != null) {\n        scrollPage(prev, null, true);\n      }\n    }\n\n    var oldPageY = 0;\n    /**\n    * Detecting the direction of the mouse movement.\n    * Used only for the middle button of the mouse.\n    */\n\n    function mouseMoveHandler(e) {\n      if (!getOptions().autoScrolling) {\n        return;\n      }\n\n      if (state.canScroll) {\n        // moving up\n        if (e.pageY < oldPageY && getIsScrollAllowed().m.up) {\n          moveSectionUp();\n        } // moving down\n        else if (e.pageY > oldPageY && getIsScrollAllowed().m.down) {\n          moveSectionDown();\n        }\n      }\n\n      oldPageY = e.pageY;\n    }\n    function setOldPageY(value) {\n      oldPageY = value;\n    }\n\n    /**\n    * Determines the way of scrolling up or down:\n    * by 'automatically' scrolling a section or by using the default and normal scrolling.\n    */\n\n    function scrolling(type) {\n      if (!getIsScrollAllowed().m[type]) {\n        return;\n      }\n\n      var scrollSection = type === 'down' ? moveSectionDown : moveSectionUp;\n\n      if (getOptions().scrollOverflow && scrollOverflowHandler.isScrollable(getState().activeSection)) {\n        //is the scrollbar at the start/end of the scroll?\n        if (scrollOverflowHandler.isScrolled(type, getState().activeSection.item) && scrollOverflowHandler.shouldMovePage()) {\n          scrollSection();\n        }\n      } else {\n        scrollSection();\n      }\n    }\n\n    var touchStartY = 0;\n    var touchStartX = 0;\n    var touchEndY = 0;\n    var touchEndX = 0;\n    var MSPointer = getMSPointer();\n    var pointers = {\n      touchmove: 'ontouchmove' in window ? 'touchmove' : MSPointer ? MSPointer.move : null,\n      touchstart: 'ontouchstart' in window ? 'touchstart' : MSPointer ? MSPointer.down : null\n    };\n    /**\n    * Adds the possibility to auto scroll through sections on touch devices.\n    */\n\n    function addTouchHandler() {\n      if (!pointers.touchmove) {\n        return;\n      }\n\n      if (isTouchDevice || isTouch) {\n        if (getOptions().autoScrolling) {\n          $body.removeEventListener(pointers.touchmove, preventBouncing, {\n            passive: false\n          });\n          $body.addEventListener(pointers.touchmove, preventBouncing, {\n            passive: false\n          });\n        }\n\n        var touchWrapper = getOptions().touchWrapper;\n        touchWrapper.removeEventListener(pointers.touchstart, touchStartHandler);\n        touchWrapper.removeEventListener(pointers.touchmove, touchMoveHandler, {\n          passive: false\n        });\n        touchWrapper.addEventListener(pointers.touchstart, touchStartHandler);\n        touchWrapper.addEventListener(pointers.touchmove, touchMoveHandler, {\n          passive: false\n        });\n      }\n    }\n    /**\n    * Removes the auto scrolling for touch devices.\n    */\n\n    function removeTouchHandler() {\n      if (!pointers.touchmove) {\n        return;\n      }\n\n      if (isTouchDevice || isTouch) {\n        // normalScrollElements requires it off #2691\n        if (getOptions().autoScrolling) {\n          $body.removeEventListener(pointers.touchmove, touchMoveHandler, {\n            passive: false\n          });\n          $body.removeEventListener(pointers.touchmove, preventBouncing, {\n            passive: false\n          });\n        }\n\n        var touchWrapper = getOptions().touchWrapper;\n        touchWrapper.removeEventListener(pointers.touchstart, touchStartHandler);\n        touchWrapper.removeEventListener(pointers.touchmove, touchMoveHandler, {\n          passive: false\n        });\n      }\n    }\n    /* Detecting touch events\n\n    * As we are changing the top property of the page on scrolling, we can not use the traditional way to detect it.\n    * This way, the touchstart and the touch moves shows an small difference between them which is the\n    * used one to determine the direction.\n    */\n\n    function touchMoveHandler(e) {\n      var activeSection = closest(e.target, SECTION_SEL) || getState().activeSection.item;\n      var hasActiveSectionOverflow = scrollOverflowHandler.isScrollable(getState().activeSection);\n\n      if (isReallyTouch(e)) {\n        setState({\n          isGrabbing: true,\n          isUsingWheel: false\n        });\n\n        if (getOptions().autoScrolling) {\n          if (hasActiveSectionOverflow && !state.canScroll || getOptions().scrollBar) {\n            //preventing the easing on iOS devices\n            preventDefault(e);\n          }\n        }\n\n        var touchEvents = getEventsPage(e);\n        touchEndY = touchEvents.y;\n        touchEndX = touchEvents.x;\n        var isVerticalMovementEnough = Math.abs(touchStartY - touchEndY) > win.innerHeight / 100 * getOptions().touchSensitivity;\n        var isHorizontalMovementEnough = Math.abs(touchStartX - touchEndX) > getWindowWidth() / 100 * getOptions().touchSensitivity;\n        var isHorizontalPredominantMove = $(SLIDES_WRAPPER_SEL, activeSection).length && Math.abs(touchStartX - touchEndX) > Math.abs(touchStartY - touchEndY);\n        var directionH = touchStartX > touchEndX ? 'right' : 'left';\n        var directionV = touchStartY > touchEndY ? 'down' : 'up';\n        var direction = isHorizontalPredominantMove ? directionH : directionV;\n        setState({\n          touchDirection: direction\n        }); //if movement in the X axys is greater than in the Y and the currect section has slides...\n\n        if (isHorizontalPredominantMove) {\n          //is the movement greater than the minimum resistance to scroll?\n          if (!state.slideMoving && isHorizontalMovementEnough) {\n            if (touchStartX > touchEndX) {\n              if (getIsScrollAllowed().m.right) {\n                EventEmitter.emit(events.moveSlideRight, {\n                  section: activeSection\n                });\n              }\n            } else {\n              if (getIsScrollAllowed().m.left) {\n                EventEmitter.emit(events.moveSlideLeft, {\n                  section: activeSection\n                });\n              }\n            }\n          }\n        } //vertical scrolling (only when autoScrolling is enabled)\n        else if (getOptions().autoScrolling && state.canScroll) {\n          //is the movement greater than the minimum resistance to scroll?\n          if (isVerticalMovementEnough) {\n            scrolling(directionV);\n          }\n        }\n      }\n    }\n    /**\n    * As IE >= 10 fires both touch and mouse events when using a mouse in a touchscreen\n    * this way we make sure that is really a touch event what IE is detecting.\n    */\n\n\n    function isReallyTouch(e) {\n      //if is not IE   ||  IE is detecting `touch` or `pen`\n      return typeof e.pointerType === 'undefined' || e.pointerType != 'mouse';\n    }\n    /**\n    * Handler for the touch start event.\n    */\n\n\n    function touchStartHandler(e) {\n      //stopping the auto scroll to adjust to a section\n      if (getOptions().fitToSection) {\n        setState({\n          activeAnimation: false\n        });\n      }\n\n      if (isReallyTouch(e)) {\n        var touchEvents = getEventsPage(e);\n        touchStartY = touchEvents.y;\n        touchStartX = touchEvents.x;\n      }\n\n      windowAddEvent('touchend', touchEndHandler);\n    }\n    /**\n    * Handler for the touch end event.\n    */\n\n\n    function touchEndHandler() {\n      windowRemoveEvent('touchend', touchEndHandler);\n      setState({\n        isGrabbing: false\n      });\n    }\n    /**\n    * Gets the pageX and pageY properties depending on the browser.\n    * https://github.com/alvarotrigo/fullPage.js/issues/194#issuecomment-34069854\n    */\n\n\n    function getEventsPage(e) {\n      var events = {};\n      events.y = typeof e.pageY !== 'undefined' && (e.pageY || e.pageX) ? e.pageY : e.touches[0].pageY;\n      events.x = typeof e.pageX !== 'undefined' && (e.pageY || e.pageX) ? e.pageX : e.touches[0].pageX; //in touch devices with scrollBar:true, e.pageY is detected, but we have to deal with touch events. #1008\n\n      if (isTouch && isReallyTouch(e) && getOptions().scrollBar && typeof e.touches !== 'undefined') {\n        events.y = e.touches[0].pageY;\n        events.x = e.touches[0].pageX;\n      }\n\n      return events;\n    }\n    /*\n    * Returns and object with Microsoft pointers (for IE<11 and for IE >= 11)\n    * http://msdn.microsoft.com/en-us/library/ie/dn304886(v=vs.85).aspx\n    */\n\n\n    function getMSPointer() {\n      var pointer; //IE >= 11 & rest of browsers\n\n      if (win.PointerEvent) {\n        pointer = {\n          down: 'pointerdown',\n          move: 'pointermove'\n        };\n      }\n\n      return pointer;\n    }\n    /*\n    * Preventing bouncing in iOS #2285\n    */\n\n\n    function preventBouncing(e) {\n      if (getOptions().autoScrolling && isReallyTouch(e) && getIsScrollAllowed().m.up) {\n        //preventing the easing on iOS devices\n        if (!state.canScroll) {\n          preventDefault(e);\n        }\n      }\n    }\n\n    FP.moveSlideLeft = moveSlideLeft;\n    FP.moveSlideRight = moveSlideRight;\n    /**\n    * Slides a slider to the given direction.\n    * Optional `section` param.\n    */\n\n    function moveSlide(direction, section) {\n      var activeSectionItem = section == null ? getState().activeSection.item : section;\n      var activeSection = getPanelByElement(state.sections, activeSectionItem);\n      var slides = $(SLIDES_WRAPPER_SEL, activeSectionItem)[0]; // more than one slide needed and nothing should be sliding\n\n      if (slides == null || state.slideMoving || activeSection.slides.length < 2) {\n        return;\n      }\n\n      var currentSlide = activeSection.activeSlide;\n      var destiny = direction === 'left' ? currentSlide.prev() : currentSlide.next(); //isn't there a next slide in the secuence?\n\n      if (!destiny) {\n        //respect loopHorizontal setting\n        if (!getOptions().loopHorizontal) return;\n        destiny = direction === 'left' ? getLast(activeSection.slides) : activeSection.slides[0];\n      }\n\n      setState({\n        slideMoving: !FP.test.isTesting\n      });\n      landscapeScroll(slides, destiny.item, direction);\n    }\n    /**\n    * Slides left the slider of the active section.\n    * Optional `section` param.\n    */\n\n    function moveSlideLeft(section) {\n      moveSlide('left', section);\n    }\n    /**\n    * Slides right the slider of the active section.\n    * Optional `section` param.\n    */\n\n    function moveSlideRight(section) {\n      moveSlide('right', section);\n    }\n\n    /**\n    * Gets a section by its anchor / index\n    */\n\n    function getSectionByAnchor(sectionAnchor) {\n      var section = getState().sections.filter(function (section) {\n        return section.anchor === sectionAnchor;\n      })[0];\n\n      if (!section) {\n        var sectionIndex = typeof sectionAnchor !== 'undefined' ? sectionAnchor - 1 : 0;\n        section = getState().sections[sectionIndex];\n      }\n\n      return section;\n    }\n\n    /**\n    * Scrolls the slider to the given slide destination for the given section\n    */\n\n    function scrollSlider(slideElem) {\n      if (slideElem != null) {\n        landscapeScroll(closest(slideElem, SLIDES_WRAPPER_SEL), slideElem);\n      }\n    }\n\n    /**\n    * Scrolls to the given section and slide anchors\n    */\n\n    function scrollPageAndSlide(sectionAnchor, slideAnchor) {\n      var section = getSectionByAnchor(sectionAnchor); //do nothing if there's no section with the given anchor name\n\n      if (section == null) return;\n      var slideElem = getSlideByAnchor(slideAnchor, section); //we need to scroll to the section and then to the slide\n\n      if ((!section.anchor || section.anchor !== state.lastScrolledDestiny) && !hasClass(section.item, ACTIVE)) {\n        scrollPage(section, function () {\n          scrollSlider(slideElem);\n        });\n      } //if we were already in the section\n      else {\n        scrollSlider(slideElem);\n      }\n    }\n    /**\n    * Gets a slide inside a given section by its anchor / index\n    */\n\n    function getSlideByAnchor(slideAnchor, section) {\n      var slide = section.slides.filter(function (slide) {\n        return slide.anchor === slideAnchor;\n      })[0];\n\n      if (slide == null) {\n        slideAnchor = typeof slideAnchor !== 'undefined' ? slideAnchor : 0;\n        slide = section.slides[slideAnchor];\n      }\n\n      return slide ? slide.item : null;\n    }\n\n    FP.moveTo = moveTo$1;\n    /**\n    * Moves the page to the given section and slide.\n    * Anchors or index positions can be used as params.\n    */\n\n    function moveTo$1(sectionAnchor, slideAnchor) {\n      var destiny = getSectionByAnchor(sectionAnchor);\n\n      if (typeof slideAnchor !== 'undefined') {\n        scrollPageAndSlide(sectionAnchor, slideAnchor);\n      } else if (destiny != null) {\n        scrollPage(destiny);\n      }\n    }\n\n    //@ts-check\n    var g_controlPressed;\n    var g_keydownId;\n    var g_elToFocus;\n    EventEmitter.on(events.bindEvents, bindEvents$8);\n\n    function bindEvents$8() {\n      //when opening a new tab (ctrl + t), `control` won't be pressed when coming back.\n      windowAddEvent('blur', blurHandler); //Sliding with arrow keys, both, vertical and horizontal\n\n      docAddEvent('keydown', keydownHandler); //to prevent scrolling while zooming\n\n      docAddEvent('keyup', keyUpHandler);\n      EventEmitter.on(events.onDestroy, onDestroy$5);\n      EventEmitter.on(events.afterSlideLoads, onAfterSlideLoads);\n      EventEmitter.on(events.afterSectionLoads, afterSectionLoads);\n    }\n\n    function onDestroy$5() {\n      clearTimeout(g_keydownId);\n      docRemoveEvent('keydown', keydownHandler);\n      docRemoveEvent('keyup', keyUpHandler);\n    } //Sliding with arrow keys, both, vertical and horizontal\n\n\n    function keydownHandler(e) {\n      clearTimeout(g_keydownId);\n      var keyCode = e.keyCode;\n      var isPressingHorizontalArrows = [37, 39].indexOf(keyCode) > -1;\n      var canScrollWithKeyboard = getOptions().autoScrolling || getOptions().fitToSection || isPressingHorizontalArrows; //tab?\n\n      if (keyCode === 9) {\n        onTab(e);\n      } else if (!isInsideInput() && getOptions().keyboardScrolling && canScrollWithKeyboard) {\n        g_controlPressed = e.ctrlKey;\n        g_keydownId = setTimeout(function () {\n          onkeydown(e);\n        }, 0);\n      }\n    }\n    /**\n    * Keydown event\n    */\n\n\n    function onkeydown(e) {\n      var shiftPressed = e.shiftKey;\n      var activeElement = doc.activeElement;\n      var isMediaFocused = matches(activeElement, 'video') || matches(activeElement, 'audio');\n      var isScrolled = {\n        up: scrollOverflowHandler.isScrolled('up', getState().activeSection.item),\n        down: scrollOverflowHandler.isScrolled('down', getState().activeSection.item)\n      };\n      var isUsingHorizontalArrowKeys = [37, 39].indexOf(e.keyCode) > -1;\n      cancelDirectionKeyEvents(e); //do nothing if we can not scroll or we are not using horizotnal key arrows.\n\n      if (!state.canScroll && !isUsingHorizontalArrowKeys) {\n        return;\n      }\n\n      setState({\n        scrollTrigger: 'keydown'\n      });\n\n      switch (e.keyCode) {\n        //up\n        case 38:\n        case 33:\n          if (getIsScrollAllowed().k.up && isScrolled.up) {\n            if (state.isBeyondFullpage) {\n              EventEmitter.emit(events.onKeyDown, {\n                e: e\n              });\n            } else {\n              moveSectionUp();\n            }\n          } else {\n            scrollOverflowHandler.focusScrollable();\n          }\n\n          break;\n        //down\n\n        case 32:\n          //spacebar\n          if (shiftPressed && getIsScrollAllowed().k.up && !isMediaFocused && isScrolled.up) {\n            moveSectionUp();\n            break;\n          }\n\n        /* falls through */\n\n        case 40:\n        case 34:\n          if (getIsScrollAllowed().k.down && isScrolled.down) {\n            if (state.isBeyondFullpage) {\n              return;\n            } // space bar?\n\n\n            if (e.keyCode !== 32 || !isMediaFocused) {\n              moveSectionDown();\n            }\n          } else {\n            scrollOverflowHandler.focusScrollable();\n          }\n\n          break;\n        //Home\n\n        case 36:\n          if (getIsScrollAllowed().k.up) {\n            moveTo$1(1);\n          }\n\n          break;\n        //End\n\n        case 35:\n          if (getIsScrollAllowed().k.down) {\n            moveTo$1(getState().sections.length);\n          }\n\n          break;\n        //left\n\n        case 37:\n          if (getIsScrollAllowed().k.left) {\n            moveSlideLeft();\n          }\n\n          break;\n        //right\n\n        case 39:\n          if (getIsScrollAllowed().k.right) {\n            moveSlideRight();\n          }\n\n          break;\n\n        default:\n          return;\n        // exit this handler for other keys\n      }\n    } //to prevent scrolling while zooming\n\n\n    function keyUpHandler(e) {\n      if (state.isWindowFocused) {\n        //the keyup gets fired on new tab ctrl + t in Firefox\n        g_controlPressed = e.ctrlKey;\n      }\n    } //when opening a new tab (ctrl + t), `control` won't be pressed when coming back.\n\n\n    function blurHandler() {\n      setState({\n        isWindowFocused: false\n      });\n      g_controlPressed = false;\n    }\n    /**\n    * Makes sure the tab key will only focus elements within the current section/slide\n    * preventing this way from breaking the page.\n    * Based on \"Modals and keyboard traps\"\n    * from https://developers.google.com/web/fundamentals/accessibility/focus/using-tabindex\n    */\n\n\n    function onTab(e) {\n      var isShiftPressed = e.shiftKey;\n      var activeElement = doc.activeElement;\n      var focusableElements = getFocusables(getSlideOrSection(getState().activeSection.item));\n\n      function preventAndFocusFirst(e) {\n        preventDefault(e);\n        return focusableElements[0] ? focusableElements[0].focus() : null;\n      } // deactivating tab while scrolling #4550\n\n\n      if (!state.canScroll) {\n        preventDefault(e);\n        return;\n      } //outside any section or slide? Let's not hijack the tab!\n\n\n      if (isFocusOutside(e)) {\n        return;\n      } //is there an element with focus?\n\n\n      if (activeElement) {\n        if (closest(activeElement, SECTION_ACTIVE_SEL + ',' + SECTION_ACTIVE_SEL + ' ' + SLIDE_ACTIVE_SEL) == null) {\n          activeElement = preventAndFocusFirst(e);\n        }\n      } //no element if focused? Let's focus the first one of the section/slide\n      else {\n        preventAndFocusFirst(e);\n      } //when reached the first or last focusable element of the section/slide\n      //we prevent the tab action to keep it in the last focusable element\n\n\n      var isFirstFocusableInSection = activeElement == focusableElements[0];\n      var isLastFocusableInSection = activeElement == focusableElements[focusableElements.length - 1];\n      var isNextItem = !isShiftPressed && isLastFocusableInSection;\n      var isPrevItem = isShiftPressed && isFirstFocusableInSection;\n\n      if (isPrevItem || isNextItem) {\n        preventDefault(e);\n        var focusInfo = getPanelWithFocusable(isPrevItem);\n        var destinationPanel = focusInfo ? focusInfo.panel : null;\n\n        if (destinationPanel) {\n          var destinationSection = destinationPanel.isSection ? destinationPanel : destinationPanel.parent;\n          EventEmitter.emit(events.onScrollPageAndSlide, {\n            sectionAnchor: destinationSection.index() + 1,\n            slideAnchor: destinationPanel.isSection ? 0 : destinationPanel.index()\n          });\n          g_elToFocus = focusInfo.itemToFocus;\n          preventDefault(e);\n        }\n      }\n    }\n\n    function onAfterSlideLoads(v) {\n      focusItem();\n    }\n\n    function afterSectionLoads(v) {\n      if (!closest(g_elToFocus, SLIDE_SEL) || closest(g_elToFocus, SLIDE_ACTIVE_SEL)) {\n        focusItem();\n      }\n    }\n\n    function focusItem() {\n      if (g_elToFocus) {\n        g_elToFocus.focus();\n        g_elToFocus = null;\n      }\n    }\n    /**\n     * Get's the panel containing the element to focus.\n     *\n     */\n\n\n    function getPanelWithFocusable(isPrevItem) {\n      var action = isPrevItem ? 'prevPanel' : 'nextPanel';\n      var focusableElements = [];\n      var panelWithFocusables;\n      var currentPanel = getSlideOrSectionPanel(getActivePanel()[action]());\n\n      do {\n        focusableElements = getFocusables(currentPanel.item);\n\n        if (focusableElements.length) {\n          panelWithFocusables = {\n            panel: currentPanel,\n            itemToFocus: focusableElements[isPrevItem ? focusableElements.length - 1 : 0]\n          };\n        }\n\n        currentPanel = getSlideOrSectionPanel(currentPanel[action]());\n      } while (currentPanel && focusableElements.length === 0);\n\n      return panelWithFocusables;\n    }\n    /**\n    * Gets all the focusable elements inside the passed element.\n    */\n\n\n    function getFocusables(el) {\n      return [].slice.call($(focusableElementsString, el)).filter(function (item) {\n        return getAttr(item, 'tabindex') !== '-1' && //are also not hidden elements (or with hidden parents)\n        item.offsetParent !== null;\n      });\n    }\n    /**\n    * Determines whether the focus is outside fullpage.js sections/slides or not.\n    */\n\n\n    function isFocusOutside(e) {\n      var allFocusables = getFocusables(doc);\n      var currentFocusIndex = allFocusables.indexOf(doc.activeElement);\n      var focusDestinationIndex = e.shiftKey ? currentFocusIndex - 1 : currentFocusIndex + 1;\n      var focusDestination = allFocusables[focusDestinationIndex];\n      var destinationItemSlide = closest(focusDestination, SLIDE_SEL);\n      var destinationItemSection = closest(focusDestination, SECTION_SEL);\n      return !destinationItemSlide && !destinationItemSection;\n    }\n\n    function shouldCancelKeyboardNavigation(e) {\n      // https://keycode.info/for/34\n      // 40 = arrow down\n      // 38 = arrow up\n      // 32 = spacebar\n      // 33  = PageUp\n      // 34 = PageDown\n      var keyControls = [40, 38, 32, 33, 34];\n      return keyControls.indexOf(e.keyCode) > -1 && !state.isBeyondFullpage;\n    } //preventing the scroll with arrow keys & spacebar & Page Up & Down keys\n\n\n    function cancelDirectionKeyEvents(e) {\n      if (shouldCancelKeyboardNavigation(e) && !closest(e.target, OVERFLOW_SEL)) {\n        e.preventDefault();\n      }\n    }\n\n    function getControlPressed() {\n      return g_controlPressed;\n    }\n\n    var prevTime = new Date().getTime();\n    var scrollings = [];\n    FP.setMouseWheelScrolling = setMouseWheelScrolling;\n    /**\n    * Adds or remove the possibility of scrolling through sections by using the mouse wheel or the trackpad.\n    */\n\n    function setMouseWheelScrolling(value) {\n      if (value) {\n        addMouseWheelHandler();\n        addMiddleWheelHandler();\n      } else {\n        removeMouseWheelHandler();\n        removeMiddleWheelHandler();\n      }\n    }\n    /**\n    * Adds the auto scrolling action for the mouse wheel and trackpad.\n    * After this function is called, the mousewheel and trackpad movements will scroll through sections\n    * https://developer.mozilla.org/en-US/docs/Web/Events/wheel\n    */\n\n\n    function addMouseWheelHandler() {\n      var prefix = '';\n\n      var _addEventListener;\n\n      if (win.addEventListener) {\n        _addEventListener = \"addEventListener\";\n      } else {\n        _addEventListener = \"attachEvent\";\n        prefix = 'on';\n      } // detect available wheel event\n\n\n      var support = 'onwheel' in doc.createElement('div') ? 'wheel' : // Modern browsers support \"wheel\"\n      // @ts-ignore\n      doc.onmousewheel !== undefined ? 'mousewheel' : // Webkit and IE support at least \"mousewheel\"\n      'DOMMouseScroll'; // let's assume that remaining browsers are older Firefox\n\n      var passiveEvent = getPassiveOptionsIfPossible();\n\n      if (support == 'DOMMouseScroll') {\n        doc[_addEventListener](prefix + 'MozMousePixelScroll', MouseWheelHandler, passiveEvent);\n      } //handle MozMousePixelScroll in older Firefox\n      else {\n        doc[_addEventListener](prefix + support, MouseWheelHandler, passiveEvent);\n      }\n    }\n    /**\n    * Binding the mousemove when the mouse's middle button is pressed\n    */\n\n\n    function addMiddleWheelHandler() {\n      getContainer().addEventListener('mousedown', mouseDownHandler);\n      getContainer().addEventListener('mouseup', mouseUpHandler);\n    }\n    /**\n    * Removes the auto scrolling action fired by the mouse wheel and trackpad.\n    * After this function is called, the mousewheel and trackpad movements won't scroll through sections.\n    */\n\n\n    function removeMouseWheelHandler() {\n      if (doc.addEventListener) {\n        docRemoveEvent('mousewheel', MouseWheelHandler, false); //IE9, Chrome, Safari, Oper\n\n        docRemoveEvent('wheel', MouseWheelHandler, false); //Firefox\n\n        docRemoveEvent('MozMousePixelScroll', MouseWheelHandler, false); //old Firefox\n      } else {\n        // @ts-ignore\n        doc.detachEvent('onmousewheel', MouseWheelHandler); //IE 6/7/8\n      }\n    }\n    /**\n    * Unbinding the mousemove when the mouse's middle button is released\n    */\n\n\n    function removeMiddleWheelHandler() {\n      getContainer().removeEventListener('mousedown', mouseDownHandler);\n      getContainer().removeEventListener('mouseup', mouseUpHandler);\n    }\n    /**\n     * Detecting mousewheel scrolling\n     *\n     * http://blogs.sitepointstatic.com/examples/tech/mouse-wheel/index.html\n     * http://www.sitepoint.com/html5-javascript-mouse-wheel/\n     */\n\n\n    function MouseWheelHandler(e) {\n      var curTime = new Date().getTime();\n      var isNormalScroll = hasClass($(COMPLETELY_SEL)[0], NORMAL_SCROLL);\n      var isScrollAllowedBeyondFullPage = beyondFullPageHandler(getContainer(), e);\n\n      if (!state.isUsingWheel) {\n        setState({\n          isGrabbing: false,\n          isUsingWheel: true,\n          touchDirection: 'none'\n        });\n      } //is scroll allowed?\n\n\n      if (!getIsScrollAllowed().m.down && !getIsScrollAllowed().m.up) {\n        preventDefault(e);\n        return false;\n      }\n\n      if (isScrollAllowedBeyondFullPage) {\n        return true;\n      } else if (isScrollAllowedBeyondFullPage === false) {\n        preventDefault(e);\n        return false;\n      } //autoscrolling and not zooming?\n\n\n      if (getOptions().autoScrolling && !getControlPressed() && !isNormalScroll) {\n        // cross-browser wheel delta\n        e = e || win.event;\n        var value = e.wheelDelta || -e.deltaY || -e.detail;\n        var delta = Math.max(-1, Math.min(1, value));\n        var horizontalDetection = typeof e.wheelDeltaX !== 'undefined' || typeof e.deltaX !== 'undefined';\n        var isScrollingVertically = Math.abs(e.wheelDeltaX) < Math.abs(e.wheelDelta) || Math.abs(e.deltaX) < Math.abs(e.deltaY) || !horizontalDetection;\n        var direction = delta < 0 ? 'down' : delta > 0 ? 'up' : 'none'; //Limiting the array to 150 (lets not waste memory!)\n\n        if (scrollings.length > 149) {\n          scrollings.shift();\n        } //keeping record of the previous scrollings\n\n\n        scrollings.push(Math.abs(value)); //preventing to scroll the site on mouse wheel when scrollbar is present\n\n        if (getOptions().scrollBar) {\n          preventDefault(e);\n        } //time difference between the last scroll and the current one\n\n\n        var timeDiff = curTime - prevTime;\n        prevTime = curTime; //haven't they scrolled in a while?\n        //(enough to be consider a different scrolling action to scroll another section)\n\n        if (timeDiff > 200) {\n          //emptying the array, we dont care about old scrollings for our averages\n          scrollings = [];\n        }\n\n        setState({\n          wheelDirection: direction\n        });\n\n        if (state.canScroll) {\n          var averageEnd = getAverage(scrollings, 10);\n          var averageMiddle = getAverage(scrollings, 70);\n          var isAccelerating = averageEnd >= averageMiddle; //to avoid double swipes...\n\n          if (isAccelerating && isScrollingVertically) {\n            setState({\n              scrollTrigger: 'wheel'\n            }); //scrolling down?\n\n            if (delta < 0) {\n              scrolling('down');\n            } //scrolling up?\n            else {\n              scrolling('up');\n            }\n          }\n        }\n\n        return false;\n      }\n\n      if (getOptions().fitToSection) {\n        //stopping the auto scroll to adjust to a section\n        setState({\n          activeAnimation: false\n        });\n      }\n    } //binding the mousemove when the mouse's middle button is released\n\n\n    function mouseDownHandler(e) {\n      //middle button\n      if (e.which == 2) {\n        setOldPageY(e.pageY);\n        getContainer().addEventListener('mousemove', mouseMoveHandler);\n      }\n    } //unbinding the mousemove when the mouse's middle button is released\n\n\n    function mouseUpHandler(e) {\n      //middle button\n      if (e.which == 2) {\n        getContainer().removeEventListener('mousemove', mouseMoveHandler);\n      }\n    }\n    /**\n    * Adds or remove the mouse wheel hijacking\n    */\n\n\n    function setMouseHijack(value) {\n      if (value) {\n        setMouseWheelScrolling(true);\n        addTouchHandler();\n      } else {\n        setMouseWheelScrolling(false);\n        removeTouchHandler();\n      }\n    }\n\n    var g_canFireMouseEnterNormalScroll = true;\n    EventEmitter.on(events.bindEvents, bindEvents$7);\n\n    function bindEvents$7() {\n      /**\n      * Applying normalScroll elements.\n      * Ignoring the scrolls over the specified selectors.\n      */\n      if (getOptions().normalScrollElements) {\n        ['mouseenter', 'touchstart'].forEach(function (eventName) {\n          forMouseLeaveOrTouch(eventName, false);\n        });\n        ['mouseleave', 'touchend'].forEach(function (eventName) {\n          forMouseLeaveOrTouch(eventName, true);\n        });\n      }\n\n      EventEmitter.on(events.onDestroy, onDestroy$4);\n    }\n\n    function onDestroy$4() {\n      ['mouseenter', 'touchstart', 'mouseleave', 'touchend'].forEach(function (eventName) {\n        docRemoveEvent(eventName, onMouseEnterOrLeave, true); //true is required!\n      });\n    }\n\n    function forMouseLeaveOrTouch(eventName, allowScrolling) {\n      //a way to pass arguments to the onMouseEnterOrLeave function\n      document['fp_' + eventName] = allowScrolling;\n      docAddEvent(eventName, onMouseEnterOrLeave, true); //capturing phase\n    }\n\n    function onMouseEnterOrLeave(e) {\n      var type = e.type;\n      var isInsideOneNormalScroll = false; //onMouseLeave will use the destination target, not the one we are moving away from\n\n      var target = type === 'mouseleave' ? e.toElement || e.relatedTarget : e.target; //coming from closing a normalScrollElements modal or moving outside viewport?\n\n      if (target == document || !target) {\n        setMouseHijack(true);\n        return;\n      }\n\n      if (type === 'touchend') {\n        g_canFireMouseEnterNormalScroll = false;\n        setTimeout(function () {\n          g_canFireMouseEnterNormalScroll = true;\n        }, 800);\n      } //preventing mouseenter event to do anything when coming from a touchEnd event\n      //fixing issue #3576\n\n\n      if (type === 'mouseenter' && !g_canFireMouseEnterNormalScroll) {\n        return;\n      }\n\n      var normalSelectors = getOptions().normalScrollElements.split(',');\n      normalSelectors.forEach(function (normalSelector) {\n        if (!isInsideOneNormalScroll) {\n          var isNormalScrollTarget = matches(target, normalSelector); //leaving a child inside the normalScoll element is not leaving the normalScroll #3661\n\n          var isNormalScrollChildFocused = closest(target, normalSelector);\n\n          if (isNormalScrollTarget || isNormalScrollChildFocused) {\n            if (!FP.shared.isNormalScrollElement) {\n              setMouseHijack(false);\n            }\n\n            FP.shared.isNormalScrollElement = true;\n            isInsideOneNormalScroll = true;\n          }\n        }\n      }); //not inside a single normal scroll element anymore?\n\n      if (!isInsideOneNormalScroll && FP.shared.isNormalScrollElement) {\n        setMouseHijack(true);\n        FP.shared.isNormalScrollElement = false;\n      }\n    }\n\n    FP.silentMoveTo = silentMoveTo;\n    /**\n    * Moves the page to the given section and slide with no animation.\n    * Anchors or index positions can be used as params.\n    */\n\n    function silentMoveTo(sectionAnchor, slideAnchor) {\n      setScrollingSpeed(0, 'internal');\n      moveTo$1(sectionAnchor, slideAnchor);\n      setScrollingSpeed(getOriginals().scrollingSpeed, 'internal');\n    }\n\n    var previousHeight = getWindowHeight();\n    var windowsWidth = getWindowWidth();\n    var g_resizeId;\n    var g_isConsecutiveResize = false;\n    var g_resizeMobileHandlerId;\n    FP.reBuild = reBuild;\n    EventEmitter.on(events.bindEvents, bindEvents$6);\n\n    function bindEvents$6() {\n      // Setting VH correctly in mobile devices\n      resizeHandler(); //when resizing the site, we adjust the heights of the sections, slimScroll...\n\n      windowAddEvent('resize', resizeHandler);\n      EventEmitter.on(events.onDestroy, onDestroy$3);\n    }\n\n    function onDestroy$3() {\n      clearTimeout(g_resizeId);\n      clearTimeout(g_resizeMobileHandlerId);\n      windowRemoveEvent('resize', resizeHandler);\n    }\n    /*\n    * Resize event handler.\n    */\n\n\n    function resizeHandler() {\n      if (!g_isConsecutiveResize) {\n        if (getOptions().autoScrolling && !getOptions().scrollBar || !getOptions().fitToSection) {\n          setSectionsHeight(getWindowHeight());\n        }\n      }\n\n      fitToActiveSection();\n      g_isConsecutiveResize = true; //in order to call the functions only when the resize is finished\n      //http://stackoverflow.com/questions/4298612/jquery-how-to-call-resize-event-only-once-its-finished-resizing    \n\n      clearTimeout(g_resizeId);\n      g_resizeId = setTimeout(function () {\n        //issue #3336 \n        //(some apps or browsers, like Chrome/Firefox for Mobile take time to report the real height)\n        //so we check it 3 times with intervals in that case\n        // for(var i = 0; i< 4; i++){\n        resizeActions();\n        g_isConsecutiveResize = false; // }\n      }, 400);\n    }\n\n    function fitToActiveSection() {\n      if (isTouchDevice) {\n        // Issue #4393 and previously in v3, #3336\n        // (some apps or browsers, like Chrome/Firefox will delay a bit to scroll \n        // to the focused input\n        for (var i = 0; i < 4; i++) {\n          g_resizeMobileHandlerId = setTimeout(function () {\n            window.requestAnimationFrame(function () {\n              // on Android devices the browser scrolls to the focused element\n              // messing up the whole page structure. So we need to update the\n              // translate3d value when the keyboard shows/hides\n              if (getOptions().autoScrolling && !getOptions().scrollBar) {\n                setState({\n                  isResizing: true\n                });\n                silentMoveTo(state.activeSection.index() + 1);\n                setState({\n                  isResizing: false\n                });\n              }\n            });\n          }, 200 * i);\n        }\n      }\n    }\n    /**\n    * When resizing the site, we adjust the heights of the sections, slimScroll...\n    */\n\n\n    function resizeActions() {\n      setState({\n        isResizing: true\n      });\n      setSectionsHeight('');\n\n      if (!getOptions().autoScrolling && !state.isBeyondFullpage) {\n        setVhUnits();\n      }\n\n      EventEmitter.emit(events.contentChanged);\n      updateState(); //checking if it needs to get responsive\n\n      responsive(); // rebuild immediately on touch devices\n\n      if (isTouchDevice) {\n        var activeElement = doc.activeElement; //if the keyboard is NOT visible\n\n        if (!matches(activeElement, 'textarea') && !matches(activeElement, 'input') && !matches(activeElement, 'select')) {\n          var currentHeight = getWindowHeight(); //making sure the change in the viewport size is enough to force a rebuild. (20 % of the window to avoid problems when hidding scroll bars)\n\n          if (Math.abs(currentHeight - previousHeight) > 20 * Math.max(previousHeight, currentHeight) / 100) {\n            reBuild(true);\n            previousHeight = currentHeight;\n          }\n        }\n      } else {\n        adjustToNewViewport();\n      }\n\n      setState({\n        isResizing: false\n      });\n    }\n    /**\n     * When resizing is finished, we adjust the slides sizes and positions\n     */\n\n\n    function reBuild(resizing) {\n      if (hasClass(getContainer(), DESTROYED)) {\n        return;\n      } //nothing to do if the plugin was destroyed\n      //updating global vars\n\n\n      setState({\n        isResizing: true,\n        windowsHeight: getWindowHeight(),\n        windowsWidth: getWindowWidth()\n      });\n      var sections = getState().sections;\n\n      for (var i = 0; i < sections.length; ++i) {\n        var section = sections[i];\n        var slidesWrap = $(SLIDES_WRAPPER_SEL, section.item)[0];\n        var slides = section.slides; //adjusting the position fo the FULL WIDTH slides...\n\n        if (slides.length > 1) {\n          landscapeScroll(slidesWrap, section.activeSlide.item);\n        }\n      }\n\n      if (getOptions().scrollOverflow) {\n        scrollOverflowHandler.makeScrollable();\n      }\n\n      var sectionIndex = getState().activeSection.index();\n\n      if (!state.isBeyondFullpage) {\n        //isn't it the first section?\n        if (sectionIndex) {\n          //adjusting the position for the current section\n          silentMoveTo(sectionIndex + 1);\n        }\n      }\n\n      setState({\n        isResizing: false\n      });\n\n      if (isFunction(getOptions().afterResize) && resizing) {\n        getOptions().afterResize.call(getContainer(), win.innerWidth, win.innerHeight);\n      }\n\n      if (isFunction(getOptions().afterReBuild) && !resizing) {\n        getOptions().afterReBuild.call(getContainer());\n      }\n\n      trigger(getContainer(), 'afterRebuild');\n    }\n    /**\n    * Adjusts a section to the viewport if it has changed.\n    */\n\n\n    function adjustToNewViewport() {\n      var newWindowHeight = getWindowHeight();\n      var newWindowWidth = getWindowWidth();\n\n      if (state.windowsHeight !== newWindowHeight || windowsWidth !== newWindowWidth) {\n        setState({\n          windowsHeight: newWindowHeight\n        });\n        windowsWidth = newWindowWidth;\n        reBuild(true);\n      }\n    }\n\n    function setSectionsHeight(value) {\n      var propertyValue = value === '' ? '' : value + 'px';\n      getState().sections.forEach(function (section) {\n        css(section.item, {\n          'height': propertyValue\n        });\n      });\n    }\n    /**\n     * Defining the value in px of a VH unit. (Used for autoScrolling: false)\n     * To fix the height issue on mobile devices when using VH units.\n     * https://css-tricks.com/the-trick-to-viewport-units-on-mobile/\n     */\n\n\n    function setVhUnits() {\n      if (!getOptions().autoScrolling || getOptions().scrollBar) {\n        // First we get the viewport height and we multiple it by 1% to get a value for a vh unit\n        var vh = win.innerHeight * 0.01; // Then we set the value in the --vh custom property to the root of the document\n\n        doc.documentElement.style.setProperty('--vh', \"\".concat(vh, \"px\"));\n      }\n    }\n\n    function getAnchorsURL() {\n      var section;\n      var slide;\n      var hash = win.location.hash;\n\n      if (hash.length) {\n        //getting the anchor link in the URL and deleting the `#`\n        var anchorsParts = hash.replace('#', '').split('/'); //using / for visual reasons and not as a section/slide separator #2803\n\n        var isFunkyAnchor = hash.indexOf('#/') > -1;\n        section = isFunkyAnchor ? '/' + anchorsParts[1] : decodeURIComponent(anchorsParts[0]);\n        var slideAnchor = isFunkyAnchor ? anchorsParts[2] : anchorsParts[1];\n\n        if (slideAnchor && slideAnchor.length) {\n          slide = decodeURIComponent(slideAnchor);\n        }\n      }\n\n      return {\n        section: section,\n        slide: slide\n      };\n    }\n\n    FP.setLockAnchors = setLockAnchors;\n    EventEmitter.on(events.bindEvents, bindEvents$5);\n\n    function bindEvents$5() {\n      //detecting any change on the URL to scroll to the given anchor link\n      //(a way to detect back history button as we play with the hashes on the URL)\n      windowAddEvent('hashchange', hashChangeHandler);\n      EventEmitter.on(events.onDestroy, onDestroy$2);\n    }\n\n    function onDestroy$2() {\n      windowRemoveEvent('hashchange', hashChangeHandler);\n    }\n    /**\n    * Sets lockAnchors\n    */\n\n\n    function setLockAnchors(value) {\n      getOptions().lockAnchors = value;\n    }\n    /**\n    * Detecting any change on the URL to scroll to the given anchor link\n    * (a way to detect back history button as we play with the hashes on the URL)\n    */\n\n\n    function hashChangeHandler() {\n      if (!state.isScrolling && !getOptions().lockAnchors) {\n        var anchors = getAnchorsURL();\n        var sectionAnchor = anchors.section;\n        var slideAnchor = anchors.slide; //when moving to a slide in the first section for the first time (first time to add an anchor to the URL)\n\n        var isFirstSlideMove = typeof state.lastScrolledDestiny === 'undefined';\n        var isFirstScrollMove = typeof state.lastScrolledDestiny === 'undefined' && typeof slideAnchor === 'undefined' && !state.slideMoving;\n\n        if (sectionAnchor && sectionAnchor.length) {\n          /*in order to call scrollpage() only once for each destination at a time\n          It is called twice for each scroll otherwise, as in case of using anchorlinks `hashChange`\n          event is fired on every scroll too.*/\n          if (sectionAnchor && sectionAnchor !== state.lastScrolledDestiny && !isFirstSlideMove || isFirstScrollMove || !state.slideMoving && state.lastScrolledSlide != slideAnchor) {\n            EventEmitter.emit(events.onScrollPageAndSlide, {\n              sectionAnchor: sectionAnchor,\n              slideAnchor: slideAnchor\n            });\n          }\n        }\n      }\n    }\n\n    EventEmitter.on(events.bindEvents, bindEvents$4);\n\n    function bindEvents$4() {\n      docAddEvent('wheel', wheelDataHandler.registerEvent, getPassiveOptionsIfPossible());\n      EventEmitter.on(events.scrollBeyondFullpage, scrollBeyondFullPage);\n      EventEmitter.on(events.onKeyDown, onKeyDown);\n    }\n\n    EventEmitter.on(events.bindEvents, bindEvents$3);\n\n    function bindEvents$3() {\n      EventEmitter.on(events.onClickOrTouch, onClickOrTouch$1);\n    }\n\n    function onClickOrTouch$1(params) {\n      var target = params.target;\n\n      if (closest(target, getOptions().menu + ' [data-menuanchor]')) {\n        menuItemsHandler.call(target, params);\n      }\n    } //Menu item handler when not using anchors or using lockAnchors:true\n\n\n    function menuItemsHandler(e) {\n      setState({\n        scrollTrigger: 'menu'\n      });\n\n      if ($(getOptions().menu)[0] && (getOptions().lockAnchors || !getOptions().anchors.length)) {\n        preventDefault(e);\n        /*jshint validthis:true */\n\n        EventEmitter.emit(events.onMenuClick, {\n          anchor: getAttr(this, 'data-menuanchor')\n        });\n      }\n    }\n\n    EventEmitter.on(events.bindEvents, bindEvents$2);\n\n    function bindEvents$2() {\n      EventEmitter.on(events.onClickOrTouch, onClickOrTouch);\n    }\n\n    function onClickOrTouch(params) {\n      var target = params.target;\n\n      if (target && closest(target, SECTION_NAV_SEL + ' a')) {\n        sectionBulletHandler.call(target, params.e);\n      } else if (matches(target, SECTION_NAV_TOOLTIP_SEL)) {\n        tooltipTextHandler.call(target);\n      } else if (matches(target, SLIDES_NAV_LINK_SEL) || closest(target, SLIDES_NAV_LINK_SEL) != null) {\n        slideBulletHandler.call(target, params.e);\n      }\n    }\n\n    var lastScroll = 0;\n    var g_scrollId;\n    var g_scrollId2;\n    EventEmitter.on(events.onDestroy, onDestroy$1); //when scrolling...\n\n    function scrollHandler(e) {\n      var currentSection;\n      var currentSectionElem;\n\n      if (state.isResizing || !getState().activeSection) {\n        return;\n      }\n\n      getLast(getState().sections);\n\n      if (getState().isBeyondFullpage || getState().isAboutToScrollToFullPage) {\n        return;\n      }\n\n      if (!getOptions().autoScrolling || getOptions().scrollBar) {\n        var currentScroll = getScrollTop();\n        var scrollDirection = getScrollDirection(currentScroll);\n        var visibleSectionIndex = 0;\n        var screen_mid = currentScroll + getWindowHeight() / 2.0;\n        var isAtBottom = $body.scrollHeight - getWindowHeight() === currentScroll;\n        var sections = getState().sections;\n        setState({\n          scrollY: currentScroll\n        }); //when using `auto-height` for a small last section it won't be centered in the viewport\n\n        if (isAtBottom) {\n          visibleSectionIndex = sections.length - 1;\n        } //is at top? when using `auto-height` for a small first section it won't be centered in the viewport\n        else if (!currentScroll) {\n          visibleSectionIndex = 0;\n        } //taking the section which is showing more content in the viewport\n        else {\n          for (var i = 0; i < sections.length; ++i) {\n            var section = sections[i].item; // Pick the the last section which passes the middle line of the screen.\n\n            if (section.offsetTop <= screen_mid) {\n              visibleSectionIndex = i;\n            }\n          }\n        }\n\n        if (isCompletelyInViewPort(scrollDirection)) {\n          if (!hasClass(getState().activeSection.item, COMPLETELY)) {\n            addClass(getState().activeSection.item, COMPLETELY);\n            removeClass(siblings(getState().activeSection.item), COMPLETELY);\n          }\n        } //geting the last one, the current one on the screen\n\n\n        currentSection = sections[visibleSectionIndex];\n        currentSectionElem = currentSection.item; //setting the visible section as active when manually scrolling\n        //executing only once the first time we reach the section\n\n        if (!currentSection.isActive) {\n          setState({\n            isScrolling: true\n          });\n          var leavingSection = getState().activeSection.item;\n          var leavingSectionIndex = getState().activeSection.index() + 1;\n          var yMovement = getYmovement(getState().activeSection, currentSectionElem);\n          var anchorLink = currentSection.anchor;\n          var sectionIndex = currentSection.index() + 1;\n          var activeSlide = currentSection.activeSlide;\n          var slideIndex;\n          var slideAnchorLink;\n          var callbacksParams = {\n            activeSection: leavingSection,\n            sectionIndex: sectionIndex - 1,\n            anchorLink: anchorLink,\n            element: currentSectionElem,\n            leavingSection: leavingSectionIndex,\n            direction: yMovement,\n            items: {\n              origin: getState().activeSection,\n              destination: currentSection\n            }\n          };\n\n          if (activeSlide) {\n            slideAnchorLink = activeSlide.anchor;\n            slideIndex = activeSlide.index();\n          }\n\n          if (state.canScroll) {\n            addClass(currentSectionElem, ACTIVE);\n            removeClass(siblings(currentSectionElem), ACTIVE);\n\n            if (isFunction(getOptions().beforeLeave)) {\n              fireCallbackOncePerScroll('beforeLeave', callbacksParams);\n            }\n\n            if (isFunction(getOptions().onLeave)) {\n              fireCallback('onLeave', callbacksParams);\n            }\n\n            if (isFunction(getOptions().afterLoad)) {\n              fireCallback('afterLoad', callbacksParams);\n            }\n\n            stopMedia(leavingSection);\n            lazyLoad(currentSectionElem);\n            playMedia(currentSectionElem);\n            activateMenuAndNav(anchorLink, sectionIndex - 1);\n\n            if (getOptions().anchors.length) {\n              //needed to enter in hashChange event when using the menu with anchor links\n              setState({\n                lastScrolledDestiny: anchorLink\n              });\n            }\n\n            updateState();\n            setPageStatus(slideIndex, slideAnchorLink, anchorLink);\n          } //small timeout in order to avoid entering in hashChange event when scrolling is not finished yet\n\n\n          clearTimeout(g_scrollId);\n          g_scrollId = setTimeout(function () {\n            setState({\n              isScrolling: false\n            });\n          }, 100);\n        }\n\n        if (getOptions().fitToSection && state.canScroll) {\n          clearTimeout(g_scrollId2);\n          g_scrollId2 = setTimeout(function () {\n            var fixedSections = state.sections.filter(function (section) {\n              var sectionValues = section.item.getBoundingClientRect();\n              return Math.round(sectionValues.bottom) === Math.round(getWindowHeight()) || Math.round(sectionValues.top) === 0;\n            }); // No section is fitting the viewport? Let's fix that!\n\n            if (!fixedSections.length) {\n              fitToSection();\n            }\n          }, getOptions().fitToSectionDelay);\n        }\n      }\n    }\n\n    function onDestroy$1() {\n      clearTimeout(g_scrollId);\n      clearTimeout(g_scrollId2);\n    }\n    /**\n    * Gets the directon of the the scrolling fired by the scroll event.\n    */\n\n\n    function getScrollDirection(currentScroll) {\n      var direction = currentScroll > lastScroll ? 'down' : 'up';\n      lastScroll = currentScroll; //needed for auto-height sections to determine if we want to scroll to the top or bottom of the destination\n\n      setState({\n        previousDestTop: currentScroll\n      });\n      return direction;\n    }\n    /**\n    * Determines whether the active section has seen in its whole or not.\n    */\n\n\n    function isCompletelyInViewPort(movement) {\n      var top = getState().activeSection.item.offsetTop;\n      var bottom = top + getWindowHeight();\n\n      if (movement == 'up') {\n        return bottom >= getScrollTop() + getWindowHeight();\n      }\n\n      return top <= getScrollTop();\n    }\n\n    EventEmitter.on(events.bindEvents, bindEvents$1);\n    EventEmitter.on(events.onDestroy, onDestroy);\n\n    function onDestroy() {\n      windowRemoveEvent('scroll', scrollHandler);\n    }\n\n    function bindEvents$1() {\n      windowAddEvent('scroll', scrollHandler);\n      doc.body.addEventListener('scroll', scrollHandler);\n      EventEmitter.on(events.onScrollPageAndSlide, function (params) {\n        scrollPageAndSlide(params.sectionAnchor, params.slideAnchor);\n      });\n      EventEmitter.on(events.onMenuClick, function (params) {\n        moveTo$1(params.anchor, undefined);\n      });\n      EventEmitter.on(events.onScrollOverflowScrolled, function (params) {\n        var scrollSection = params.direction === 'down' ? moveSectionDown : moveSectionUp;\n        scrollSection();\n      });\n      EventEmitter.on(events.scrollPage, function (params) {\n        scrollPage(params.destination);\n      });\n    }\n\n    FP.getActiveSlide = getActiveSlide;\n\n    FP.getScrollX = function () {\n      return state.scrollX;\n    };\n\n    EventEmitter.on(events.bindEvents, bindEvents);\n\n    function bindEvents() {\n      EventEmitter.on(events.onDestroy, onDestroy$6);\n      EventEmitter.on(events.landscapeScroll, function (params) {\n        landscapeScroll(params.slides, params.destination);\n      });\n      EventEmitter.on(events.moveSlideRight, function (params) {\n        moveSlideRight(params.section);\n      });\n      EventEmitter.on(events.moveSlideLeft, function (params) {\n        moveSlideLeft(params.section);\n      });\n    }\n    /**\n    * Gets the active slide.\n    */\n\n\n    function getActiveSlide() {\n      return nullOrSlide(getState().activeSection.activeSlide);\n    }\n\n    EventEmitter.on(events.bindEvents, init$1);\n\n    function init$1() {\n      var position = getOptions().credits.position || 'right';\n      var positionStyle = ['left', 'right'].indexOf(position) > -1 ? \"\".concat(position, \": 0;\") : '';\n      var waterMark = \"\\n        <div class=\\\"fp-watermark\\\" style=\\\"\".concat(positionStyle, \"\\\">\\n            <a href=\\\"https://alvarotrigo.com/fullPage/\\\" \\n                rel=\\\"nofollow noopener\\\" \\n                target=\\\"_blank\\\" \\n                style=\\\"text-decoration:none; color: #000;\\\">\\n                    \").concat(getOptions().credits.label || 'Made with fullPage.js', \"\\n            </a>\\n        </div>\\n    \");\n      var lastSection = getLast(state.sections);\n      var shouldUseWaterMark = !state.isValid || getOptions().credits.enabled;\n\n      if (lastSection && lastSection.item && shouldUseWaterMark) {\n        lastSection.item.insertAdjacentHTML('beforeend', waterMark);\n      }\n    }\n\n    !function () {\n      EventEmitter.on(events.onInitialise, function () {\n        var n, a, l;\n        setState({\n          isValid: (getOptions().licenseKey, n = getOptions().licenseKey, a = function (n) {\n            var e = parseInt(\"\\x35\\x31\\x34\").toString(16);\n            if (!n || n.length < 29 || 4 === n.split(t[0]).length) return null;\n            var r = [\"\\x45\\x61\\x63\\x68\", \"\\x66\\x6f\\x72\"][i()]().join(\"\"),\n                a = n[[\"\\x73\\x70\\x6c\\x69\\x74\"]](\"-\"),\n                l = [];\n            a[r](function (t, n) {\n              if (n < 4) {\n                var r = function (t) {\n                  var n = t[t.length - 1],\n                      e = [\"\\x4e\\x61\\x4e\", \"\\x69\\x73\"][i()]().join(\"\");\n                  return window[e](n) ? o(n) : function (t) {\n                    return t - ACTIVE.length;\n                  }(n);\n                }(t);\n\n                l.push(r);\n                var s = o(t[r]);\n\n                if (1 === n) {\n                  var a = [\"\\x70\\x61\", \"\\x64\\x53\", \"\\x74\", \"\\x61\\x72\\x74\"].join(\"\");\n                  s = s.toString()[a](2, \"0\");\n                }\n\n                e += s, 0 !== n && 1 !== n || (e += \"-\");\n              }\n            });\n            var m = 0,\n                f = \"\";\n            return n.split(\"-\").forEach(function (t, n) {\n              if (n < 4) {\n                var _i = 0;\n\n                for (var e = 0; e < 4; e++) {\n                  e !== l[n] && (_i += Math.abs(o(t[e])), isNaN(t[e]) || m++);\n                }\n\n                var r = s(_i);\n                f += r;\n              }\n            }), f += s(m), {\n              v: new Date(e + \"T00:00\"),\n              o: e.split(\"-\")[2] === 8 * (ACTIVE.length - 2) + \"\",\n              l: f\n            };\n          }(n), l = function (t) {\n            var n = r[i()]().join(\"\");\n            return t && 0 === n.indexOf(t) && t.length === n.length;\n          }(n), (a || l) && (a && e <= a.v && a.l === n.split(t[0])[4] || l || a.o) || !1)\n        });\n      });\n      var t = [\"-\"];\n      var n = \"\\x32\\x30\\x32\\x33\\x2d\\x34\\x2d\\x32\\x39\".split(\"-\"),\n          e = new Date(n[0], n[1], n[2]),\n          r = [\"se\", \"licen\", \"-\", \"v3\", \"l\", \"gp\"];\n\n      function i() {\n        return [[\"\\x72\\x65\", \"\\x76\\x65\\x72\\x73\\x65\"].join(\"\")][\"\".length];\n      }\n\n      function o(t) {\n        return t ? isNaN(t) ? t.charCodeAt(0) - 72 : t : \"\";\n      }\n\n      function s(t) {\n        var n = 72 + t;\n        return n > 90 && n < 97 && (n += 15), String.fromCharCode(n).toUpperCase();\n      }\n    }();\n\n    //@ts-check\n    FP.setKeyboardScrolling = setKeyboardScrolling;\n    /**\n    * Adds or remove the possibility of scrolling through sections by using the keyboard arrow keys\n    */\n\n    function setKeyboardScrolling(value, directions) {\n      if (typeof directions !== 'undefined') {\n        directions = directions.replace(/ /g, '').split(',');\n        directions.forEach(function (direction) {\n          setIsScrollAllowed(value, direction, 'k');\n        });\n      } else {\n        setIsScrollAllowed(value, 'all', 'k');\n        getOptions().keyboardScrolling = value;\n      }\n    }\n\n    /**\n    * Sets the data-anchor attributes to the menu elements and activates the current one.\n    */\n\n    function styleMenu(section) {\n      var index = section.index();\n\n      if (typeof getOptions().anchors[index] !== 'undefined') {\n        //activating the menu / nav element on load\n        if (section.isActive) {\n          activateMenuAndNav(getOptions().anchors[index], index);\n        }\n      } //moving the menu outside the main container if it is inside (avoid problems with fixed positions when using CSS3 tranforms)\n\n\n      if (getOptions().menu && getOptions().css3 && closest($(getOptions().menu)[0], WRAPPER_SEL) != null) {\n        $(getOptions().menu).forEach(function (menu) {\n          $body.appendChild(menu);\n        });\n      }\n    }\n\n    /**\n    * Works over the DOM structure to set it up for the current fullpage getOptions().\n    */\n\n    function prepareDom() {\n      css(getParentsUntil(getContainer(), 'body'), {\n        'height': '100%',\n        'position': 'relative'\n      }); //adding a class to recognize the container internally in the code\n\n      addClass(getContainer(), WRAPPER);\n      addClass($html, ENABLED); //due to https://github.com/alvarotrigo/fullPage.js/issues/1502\n\n      setState({\n        windowsHeight: getWindowHeight()\n      });\n      removeClass(getContainer(), DESTROYED); //in case it was destroyed before initializing it again\n\n      addInternalSelectors();\n      var sections = getState().sectionsIncludingHidden; //styling the sections / slides / menu\n\n      for (var i = 0; i < sections.length; i++) {\n        var section = sections[i];\n        var slides = section.allSlidesItems; //caching the original styles to add them back on destroy('all')\n\n        var originalStyles = getAttr(section.item, 'style');\n\n        if (originalStyles) {\n          section.item.setAttribute('data-fp-styles', originalStyles);\n        }\n\n        styleSection(section);\n        styleMenu(section); // if there's any slide\n\n        if (slides.length > 0) {\n          styleSlides(section);\n        }\n      } //fixed elements need to be moved out of the plugin container due to problems with CSS3.\n\n\n      if (getOptions().fixedElements && getOptions().css3) {\n        $(getOptions().fixedElements).forEach(function (item) {\n          $body.appendChild(item);\n        });\n      } //vertical centered of the navigation + active bullet\n\n\n      if (getOptions().navigation) {\n        addVerticalNavigation();\n      }\n\n      enableYoutubeAPI();\n\n      if (getOptions().scrollOverflow) {\n        scrollOverflowHandler.makeScrollable();\n      }\n    }\n\n    FP.shared.afterRenderActions = afterRenderActions;\n    /**\n    * Actions and callbacks to fire afterRender\n    */\n\n    function afterRenderActions() {\n      var section = getState().activeSection;\n      var sectionElem = getState().activeSection.item;\n      addClass(sectionElem, COMPLETELY);\n      lazyLoad(sectionElem);\n      lazyLoadOthers();\n      playMedia(sectionElem);\n\n      if (isDestinyTheStartingSection() && isFunction(getOptions().afterLoad)) {\n        fireCallback('afterLoad', {\n          activeSection: sectionElem,\n          element: sectionElem,\n          direction: null,\n          //for backwards compatibility callback (to be removed in a future!)\n          anchorLink: section.anchor,\n          sectionIndex: section.index(),\n          items: {\n            origin: getState().activeSection,\n            destination: getState().activeSection\n          }\n        });\n      }\n\n      if (isFunction(getOptions().afterRender)) {\n        fireCallback('afterRender');\n      }\n    }\n    /**\n    * Determines if the URL anchor destiny is the starting section (the one using 'active' class before initialization)\n    */\n\n    function isDestinyTheStartingSection() {\n      var anchor = getAnchorsURL();\n      var destinationSection = getSectionByAnchor(anchor.section);\n      return !anchor.section || !destinationSection || typeof destinationSection !== 'undefined' && destinationSection.index() === index(getStartingSection());\n    }\n\n    FP.setAllowScrolling = setAllowScrolling;\n    /**\n    * Adds or remove the possibility of scrolling through sections by using the mouse wheel/trackpad or touch gestures.\n    * Optionally a second parameter can be used to specify the direction for which the action will be applied.\n    *\n    * @param directions string containing the direction or directions separated by comma.\n    */\n\n    function setAllowScrolling(value, directions) {\n      if (typeof directions !== 'undefined') {\n        directions = directions.replace(/ /g, '').split(',');\n        directions.forEach(function (direction) {\n          setIsScrollAllowed(value, direction, 'm');\n        });\n      } else {\n        setIsScrollAllowed(value, 'all', 'm');\n      }\n    }\n\n    /**\n    * Scrolls to the anchor in the URL when loading the site\n    */\n\n    function scrollToAnchor() {\n      var anchors = getAnchorsURL();\n      var sectionAnchor = anchors.section;\n      var slideAnchor = anchors.slide;\n\n      if (sectionAnchor) {\n        //if theres any #\n        if (getOptions().animateAnchor) {\n          scrollPageAndSlide(sectionAnchor, slideAnchor);\n        } else {\n          silentMoveTo(sectionAnchor, slideAnchor);\n        }\n      } else {\n        EventEmitter.emit(events.onAfterRenderNoAnchor, null);\n      }\n    }\n\n    /*\n    * Removes inline styles added by fullpage.js\n    */\n\n    function destroyStructure() {\n      //reseting the `top` or `translate` properties to 0\n      silentScroll(0); //loading all the lazy load content\n\n      $('img[data-src], source[data-src], audio[data-src], iframe[data-src]', getContainer()).forEach(function (item) {\n        setSrc(item, 'src');\n      });\n      $('img[data-srcset]').forEach(function (item) {\n        setSrc(item, 'srcset');\n      });\n      remove($(SECTION_NAV_SEL + ', ' + SLIDES_NAV_SEL + ', ' + SLIDES_ARROW_SEL)); //removing inline styles\n\n      css(getNodes(getState().sections), {\n        'height': '',\n        'background-color': '',\n        'padding': ''\n      });\n      css(getNodes(getState().slides), {\n        'width': ''\n      });\n      css(getContainer(), {\n        'height': '',\n        'position': '',\n        '-ms-touch-action': '',\n        'touch-action': ''\n      });\n      css($htmlBody, {\n        'overflow': '',\n        'height': ''\n      }); // remove .fp-enabled class\n\n      removeClass($html, ENABLED); // remove .fp-responsive class & .fp-scrollable\n\n      removeClass($body, RESPONSIVE + ' ' + SCROLLABLE); // remove all of the .fp-viewing- classes\n\n      $body.className.split(/\\s+/).forEach(function (className) {\n        if (className.indexOf(VIEWING_PREFIX) === 0) {\n          removeClass($body, className);\n        }\n      }); //removing added classes\n\n      getNodes(getState().panels).forEach(function (item) {\n        if (getOptions().scrollOverflow) {\n          scrollOverflowHandler.destroyWrapper(item);\n        }\n\n        removeClass(item, TABLE + ' ' + ACTIVE + ' ' + COMPLETELY + ' ' + IS_OVERFLOW);\n        var previousStyles = getAttr(item, 'data-fp-styles');\n\n        if (previousStyles) {\n          item.setAttribute('style', previousStyles);\n        } //removing anchors if they were not set using the HTML markup\n\n\n        if (hasClass(item, SECTION) && !getInitialAnchorsInDom()) {\n          item.removeAttribute('data-anchor');\n        }\n      }); //removing the applied transition from the fullpage wrapper\n\n      removeAnimation(getContainer()); //Unwrapping content\n\n      [TABLE_CELL_SEL, SLIDES_CONTAINER_SEL, SLIDES_WRAPPER_SEL].forEach(function (selector) {\n        $(selector, getContainer()).forEach(function (item) {\n          //unwrap not being use in case there's no child element inside and its just text\n          unwrap(item);\n        });\n      }); //removing the applied transition from the fullpage wrapper\n\n      css(getContainer(), {\n        '-webkit-transition': 'none',\n        'transition': 'none'\n      });\n      removeClass(getContainer(), WRAPPER); //scrolling the page to the top with no animation\n\n      win.scrollTo(0, 0); //removing selectors\n\n      var usedSelectors = [SECTION, SLIDE, SLIDES_CONTAINER];\n      usedSelectors.forEach(function (item) {\n        removeClass($('.' + item), item);\n      });\n    }\n\n    FP.destroy = destroy;\n    function init() {\n      updateStructuralState();\n      updateState();\n      getOptions().scrollBar = getOptions().scrollBar || getOptions().hybrid;\n      setOptionsFromDOM();\n      prepareDom();\n      setAllowScrolling(true);\n      setMouseHijack(true);\n      setAutoScrolling(getOptions().autoScrolling, 'internal');\n      responsive(); //setting the class for the body element\n\n      setBodyClass();\n\n      if (doc.readyState === 'complete') {\n        scrollToAnchor();\n      }\n\n      windowAddEvent('load', scrollToAnchor);\n      afterRenderActions(); // Updating the state again with the new DOM\n\n      updateStructuralState();\n      updateState();\n    }\n    /*\n    * Destroys fullpage.js plugin events and optinally its html markup and styles\n    */\n\n    function destroy(all) {\n      setAutoScrolling(false, 'internal');\n      setAllowScrolling(true);\n      setMouseHijack(false);\n      setKeyboardScrolling(false);\n      addClass(getContainer(), DESTROYED);\n      EventEmitter.emit(events.onDestroy); //lets make a mess!\n\n      if (all) {\n        destroyStructure();\n      }\n    }\n\n    var isOK = function isOK() {\n      return getOptions() && state.isValid || doc.domain.indexOf('al' + 'varotri' + 'go' + '.' + 'com') > -1;\n    };\n    /**\n    * Displays warnings\n    */\n\n\n    function displayWarnings() {\n      var l = getOptions()['li' + 'c' + 'enseK' + 'e' + 'y'];\n      var msgStyle = 'font-size: 15px;background:yellow;';\n\n      if (getOptions().licenseKey.trim() === '') {\n        showError('error', 'Fullpage.js requires a `licenseKey` option. Read about it on the following URL:');\n        showError('error', 'https://github.com/alvarotrigo/fullPage.js#options');\n      } else if (!isOK()) {\n        showError('error', 'Incorrect `licenseKey`. Get one for fullPage.js version 4 here:');\n        showError('error', 'https://alvarotrigo.com/fullPage/pricing');\n      } else if (l && l.length < 20) {\n        console.warn('%c This website was made using fullPage.js slider. More info on the following website:', msgStyle);\n        console.warn('%c https://alvarotrigo.com/fullPage/', msgStyle);\n      }\n\n      if (hasClass($html, ENABLED)) {\n        showError('error', 'Fullpage.js can only be initialized once and you are doing it multiple times!');\n        return;\n      } // Disable mutually exclusive settings\n\n\n      if (getOptions().continuousVertical && (getOptions().loopTop || getOptions().loopBottom)) {\n        getOptions().continuousVertical = false;\n        showError('warn', 'Option `loopTop/loopBottom` is mutually exclusive with `continuousVertical`; `continuousVertical` disabled');\n      }\n\n      if (getOptions().scrollOverflow && (getOptions().scrollBar || !getOptions().autoScrolling)) {\n        showError('warn', 'Options scrollBar:true and autoScrolling:false are mutually exclusive with scrollOverflow:true. Sections with scrollOverflow might not work well in Firefox');\n      }\n\n      if (getOptions().continuousVertical && (getOptions().scrollBar || !getOptions().autoScrolling)) {\n        getOptions().continuousVertical = false;\n        showError('warn', 'Scroll bars (`scrollBar:true` or `autoScrolling:false`) are mutually exclusive with `continuousVertical`; `continuousVertical` disabled');\n      } //using extensions? Wrong file!\n\n\n      extensions.forEach(function (extension) {\n        //is the option set to true?\n        if (getOptions()[extension]) {\n          showError('warn', 'fullpage.js extensions require fullpage.extensions.min.js file instead of the usual fullpage.js. Requested: ' + extension);\n        }\n      }); //anchors can not have the same value as any element ID or NAME\n\n      getOptions().anchors.forEach(function (name) {\n        //case insensitive selectors (http://stackoverflow.com/a/19465187/1081396)\n        var nameAttr = [].slice.call($('[name]')).filter(function (item) {\n          return getAttr(item, 'name') && getAttr(item, 'name').toLowerCase() == name.toLowerCase();\n        });\n        var idAttr = [].slice.call($('[id]')).filter(function (item) {\n          return getAttr(item, 'id') && getAttr(item, 'id').toLowerCase() == name.toLowerCase();\n        });\n\n        if (idAttr.length || nameAttr.length) {\n          showError('error', 'data-anchor tags can not have the same value as any `id` element on the site (or `name` element for IE).');\n          var propertyName = idAttr.length ? 'id' : 'name';\n\n          if (idAttr.length || nameAttr.length) {\n            showError('error', '\"' + name + '\" is is being used by another element `' + propertyName + '` property');\n          }\n        }\n      });\n    }\n\n    function fullpage(containerSelector, options) {\n      setCache(); //only once my friend!\n\n      if (hasClass($html, ENABLED)) {\n        displayWarnings();\n        return;\n      }\n\n      setOption('touchWrapper', typeof containerSelector === 'string' ? $(containerSelector)[0] : containerSelector); // Creating some defaults, extending them with any options that were provided\n\n      setOptions(options);\n      setContainer(typeof containerSelector === 'string' ? $(containerSelector)[0] : containerSelector);\n      EventEmitter.emit(events.onInitialise);\n      displayWarnings();\n      setAPI();\n\n      if (getContainer()) {\n        EventEmitter.emit(events.beforeInit);\n        init();\n        EventEmitter.emit(events.bindEvents);\n      } // @ts-ignore\n\n\n      return win.fullpage_api;\n    }\n\n    function setAPI() {\n      FP.getFullpageData = function () {\n        return {\n          options: getOptions()\n        };\n      }; //public functions\n\n\n      FP.version = '4.0.20';\n      FP.test = Object.assign(FP.test, {\n        top: '0px',\n        translate3d: 'translate3d(0px, 0px, 0px)',\n        translate3dH: function () {\n          var a = [];\n\n          for (var i = 0; i < $(getOptions().sectionSelector, getContainer()).length; i++) {\n            a.push('translate3d(0px, 0px, 0px)');\n          }\n\n          return a;\n        }(),\n        left: function () {\n          var a = [];\n\n          for (var i = 0; i < $(getOptions().sectionSelector, getContainer()).length; i++) {\n            a.push(0);\n          }\n\n          return a;\n        }(),\n        options: getOptions(),\n        setAutoScrolling: null\n      }); //functions we want to share across files but which are not\n      //mean to be used on their own by developers\n\n      FP.shared = Object.assign(FP.shared, {\n        afterRenderActions: null,\n        isNormalScrollElement: false\n      }); // @ts-ignore\n\n      win.fullpage_api = FP;\n    }\n\n    // @ts-ignore\n\n    win.fp_easings = deepExtend(win.fp_easings, {\n      easeInOutCubic: function easeInOutCubic(t, b, c, d) {\n        if ((t /= d / 2) < 1) return c / 2 * t * t * t + b;\n        return c / 2 * ((t -= 2) * t * t + 2) + b;\n      }\n    });\n\n    /**\n     * jQuery adapter for fullPage.js 3.0.0\n     */\n    // @ts-ignore\n\n    if (win.jQuery) {\n      (function ($, fullpage) {\n\n        if (!$ || !fullpage) {\n          showError('error', 'jQuery is required to use the jQuery fullpage adapter!');\n          return;\n        }\n\n        $.fn.fullpage = function (options) {\n          options = $.extend({}, options, {\n            '$': $\n          });\n          new fullpage(this[0], options); // Creating the $.fn.fullpage object\n\n          Object.keys(FP).forEach(function (key) {\n            getOptions().$.fn.fullpage[key] = FP[key];\n          });\n        }; // @ts-ignore\n\n      })(win.jQuery, fullpage);\n    }\n\n    return fullpage;\n\n}));\n\n\n/***/ }),\n\n/***/ \"./src/index.js\":\n/*!**********************!*\\\n  !*** ./src/index.js ***!\n  \\**********************/\n/*! no exports provided */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var fullpage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fullpage.js */ \"./node_modules/fullpage.js/dist/fullpage.js\");\n/* harmony import */ var fullpage_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fullpage_js__WEBPACK_IMPORTED_MODULE_0__);\n// Optional. When using fullPage extensions\n//import scrollHorizontally from './fullpage.scrollHorizontally.min';\n\n// Optional. When using scrollOverflow:true\n//import IScroll from 'fullpage.js/vendors/scrolloverflow';\n\n// Importing fullpage.js\n\n\n// When using fullPage extensions replace the previous import\n// of fullpage.js for this file\n//import fullpage from 'fullpage.js/dist/fullpage.extensions.min';\n\n// Initializing it\nvar fullPageInstance = new fullpage_js__WEBPACK_IMPORTED_MODULE_0___default.a('#myFullpage', {\n    navigation: true,\n    sectionsColor:['#ff5f45', '#0798ec', '#fc6c7c', 'grey']\n});\n\n// Calling methods\n// fullpage_api.moveSectionDown();\n// Or\n// fullPageInstance.moveSectionDown();\n\n/***/ })\n\n/******/ });\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Z1bGxwYWdlLmpzL2Rpc3QvZnVsbHBhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtEQUEwQyxnQ0FBZ0M7QUFDMUU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnRUFBd0Qsa0JBQWtCO0FBQzFFO0FBQ0EseURBQWlELGNBQWM7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUF5QyxpQ0FBaUM7QUFDMUUsd0hBQWdILG1CQUFtQixFQUFFO0FBQ3JJO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7OztBQUdBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUksS0FBNEQ7QUFDaEUsSUFBSSxTQUN1RztBQUMzRyxDQUFDLHNCQUFzQjs7QUFFdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwrQkFBK0I7O0FBRS9CLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBLFdBQVcsaURBQWlEOzs7QUFHNUQscUNBQXFDOztBQUVyQyxvQkFBb0I7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYTs7O0FBR2I7QUFDQSxXQUFXOzs7QUFHWDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qjs7QUFFdkIsd0NBQXdDOztBQUV4QztBQUNBO0FBQ0EsV0FBVzs7O0FBR1g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxvREFBb0Q7OztBQUdqRTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7OztBQUdBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7O0FBRUEsc0VBQXNFOztBQUV0RSxvQkFBb0I7O0FBRXBCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0EsV0FBVzs7O0FBR1gseUJBQXlCOztBQUV6QjtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDhFQUE4RTs7QUFFOUU7QUFDQSwwRUFBMEU7O0FBRTFFLG1OQUFtTjs7QUFFbk47QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUIsaUJBQWlCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLDZCQUE2QiwwQkFBMEI7QUFDdkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDOztBQUV6Qzs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDZDQUE2QyxTQUFTO0FBQ3REOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOzs7QUFHWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyw0QkFBNEI7QUFDMUMsY0FBYyxPQUFPO0FBQ3JCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsa0JBQWtCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIscUJBQXFCO0FBQzFDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxxQkFBcUIsZUFBZTtBQUNwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckI7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQix1QkFBdUI7QUFDNUM7O0FBRUEsdUJBQXVCLGVBQWU7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixtQkFBbUI7QUFDeEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFlBQVk7QUFDMUIsY0FBYyxrQ0FBa0M7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxZQUFZO0FBQzFCLGNBQWMsa0NBQWtDO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZDQUE2QyxRQUFROztBQUVyRDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXVCLGVBQWU7QUFDdEM7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEscUJBQXFCLGtCQUFrQjtBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjs7QUFFbEI7O0FBRUEscUJBQXFCLHlCQUF5QjtBQUM5QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUEsOEZBQThGLGFBQWE7QUFDM0c7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGdGQUFnRixlQUFlO0FBQy9GO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlDQUFpQyxrQkFBa0I7O0FBRW5EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0Isa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCOztBQUVsQjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCOztBQUV6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLEVBQUU7O0FBRVQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPOzs7QUFHUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZDQUE2Qzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLEVBQUU7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQywrQ0FBK0M7QUFDekY7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsNkNBQTZDOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sRUFBRTs7QUFFVDtBQUNBO0FBQ0EsOENBQThDLGdEQUFnRDtBQUM5RjtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEI7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1AscURBQXFEOztBQUVyRDtBQUNBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7O0FBR1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsc0RBQXNEO0FBQ3RELFNBQVM7QUFDVDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7O0FBRWxEOztBQUVBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RTs7QUFFeEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsbUVBQW1FOztBQUVuRTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esb0RBQW9EOztBQUVwRDtBQUNBO0FBQ0E7QUFDQSxTQUFTLEVBQUU7O0FBRVg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCw0REFBNEQ7O0FBRTVEO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUCw0REFBNEQ7O0FBRTVELDZCQUE2Qjs7QUFFN0IsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEscUJBQXFCLHlCQUF5QjtBQUM5QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHFCQUFxQix5QkFBeUI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBLDREQUE0RDs7QUFFNUQ7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0hBQWtIOztBQUVsSDtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEscUJBQXFCLGdDQUFnQztBQUNyRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw4SkFBOEo7O0FBRTlKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBLE9BQU8sRUFBRTs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSx5Q0FBeUM7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RTs7QUFFdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1Asa0RBQWtEOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QyxtRUFBbUU7O0FBRW5FO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVCxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtFQUErRTs7QUFFL0Usc0RBQXNEOztBQUV0RDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSwyREFBMkQ7O0FBRTNEO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvR0FBb0c7QUFDcEc7O0FBRUE7QUFDQSw0Q0FBNEM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7OztBQUdBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7O0FBRTVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixRQUFRO0FBQ25DOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOzs7QUFHQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUIsS0FBSztBQUM5Qjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU8sTUFBTTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EscUZBQXFGOztBQUVyRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpREFBaUQ7O0FBRWpEO0FBQ0E7QUFDQSxxREFBcUQ7O0FBRXJEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1Asc0RBQXNEO0FBQ3REOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEOztBQUVoRDtBQUNBO0FBQ0EsV0FBVzs7O0FBR1gsNENBQTRDOzs7QUFHNUM7QUFDQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlEQUFpRDs7QUFFakQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlEQUFpRDs7QUFFakQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLEVBQUU7O0FBRVg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsdUdBQXVHOztBQUV2RztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0Esa0JBQWtCOztBQUVsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsK0RBQStEOztBQUUvRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxRkFBcUY7O0FBRXJGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0RBQXNEOztBQUV0RDtBQUNBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBDQUEwQzs7QUFFMUMsNkNBQTZDOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3SEFBd0g7O0FBRXhIO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsYUFBYTtBQUNiO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7O0FBR2I7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qjs7QUFFdkI7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLCtEQUErRDs7QUFFL0QsMERBQTBEOztBQUUxRCx3RUFBd0U7QUFDeEUsT0FBTztBQUNQO0FBQ0EsMkRBQTJEO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87OztBQUdQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFOztBQUV2RTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1QseUNBQXlDOztBQUV6QztBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsMkRBQTJEOztBQUUzRDtBQUNBO0FBQ0E7QUFDQSxhQUFhLEVBQUU7O0FBRWY7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RCxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEOztBQUVBO0FBQ0E7QUFDQSwwQ0FBMEM7O0FBRTFDLHFGQUFxRjs7QUFFckY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUVBQXFFOztBQUVyRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sRUFBRTs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUNBQW1DO0FBQ25DOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsTUFBTTtBQUMvQjtBQUNBLHNDQUFzQztBQUN0QyxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixPQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0I7O0FBRXBCLG1CQUFtQjs7QUFFbkI7QUFDQSw4Q0FBOEM7O0FBRTlDO0FBQ0EsZ0RBQWdEOztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQSxxQkFBcUIscUJBQXFCO0FBQzFDO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNERBQTREOztBQUU1RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDs7QUFFbkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxFQUFFOztBQUVYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLHlCQUF5QixxQkFBcUI7QUFDOUMsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBLGlEQUFpRDtBQUNqRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBLFdBQVc7OztBQUdYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEVBQUU7O0FBRWY7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLGlDQUFpQzs7QUFFakM7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsOEZBQThGO0FBQzlGLDRSQUE0UixhQUFhO0FBQ3pTO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQixpQkFBaUI7O0FBRWpCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtCQUErQixPQUFPO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLEVBQUU7O0FBRVQ7QUFDQSwrQkFBK0I7O0FBRS9CO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsNkNBQTZDOztBQUU3QztBQUNBLHdEQUF3RDs7QUFFeEQscUJBQXFCLHFCQUFxQjtBQUMxQztBQUNBLDRDQUE0Qzs7QUFFNUM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTzs7O0FBR1A7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxtRkFBbUY7O0FBRW5GO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPLEVBQUU7O0FBRVQsa0NBQWtDOztBQUVsQyx3REFBd0Q7O0FBRXhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxFQUFFOztBQUVUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBLE9BQU8sRUFBRTs7QUFFVCxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU8sRUFBRTs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsMkNBQTJDOztBQUUzQyx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxzQ0FBc0Msa0JBQWtCOztBQUV4RDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBLHVHQUF1RztBQUN2Rzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9JQUFvSTtBQUNwSSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxFQUFFOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUhBQXFIOztBQUVySDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlCQUF5Qiw0REFBNEQ7QUFDckY7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBLHlCQUF5Qiw0REFBNEQ7QUFDckY7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTyxFQUFFO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTyxFQUFFOztBQUVUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBLFdBQVc7QUFDWCx5Q0FBeUM7O0FBRXpDO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVTs7QUFFVixPQUFPO0FBQ1A7O0FBRUE7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ3QyTEQ7QUFBQTtBQUFBO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ21DOztBQUVuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkIsa0RBQVE7QUFDbkM7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0Esc0MiLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2luZGV4LmpzXCIpO1xuIiwiLyohXG4qIGZ1bGxQYWdlIDQuMC4yMFxuKiBodHRwczovL2dpdGh1Yi5jb20vYWx2YXJvdHJpZ28vZnVsbFBhZ2UuanNcbipcbiogQGxpY2Vuc2UgR1BMdjMgZm9yIG9wZW4gc291cmNlIHVzZSBvbmx5XG4qIG9yIEZ1bGxwYWdlIENvbW1lcmNpYWwgTGljZW5zZSBmb3IgY29tbWVyY2lhbCB1c2VcbiogaHR0cDovL2FsdmFyb3RyaWdvLmNvbS9mdWxsUGFnZS9wcmljaW5nL1xuKlxuKiBDb3B5cmlnaHQgKEMpIDIwMTggaHR0cDovL2FsdmFyb3RyaWdvLmNvbS9mdWxsUGFnZSAtIEEgcHJvamVjdCBieSBBbHZhcm8gVHJpZ29cbiovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gICAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLmZ1bGxwYWdlID0gZmFjdG9yeSgpKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4gICAgaWYgKCFBcnJheS5wcm90b3R5cGUuZmluZCkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwgJ2ZpbmQnLCB7XG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZShwcmVkaWNhdGUpIHtcbiAgICAgICAgICAvLyAxLiBMZXQgTyBiZSA/IFRvT2JqZWN0KHRoaXMgdmFsdWUpLlxuICAgICAgICAgIGlmICh0aGlzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widGhpc1wiIGlzIG51bGwgb3Igbm90IGRlZmluZWQnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbyA9IE9iamVjdCh0aGlzKTsgLy8gMi4gTGV0IGxlbiBiZSA/IFRvTGVuZ3RoKD8gR2V0KE8sIFwibGVuZ3RoXCIpKS5cblxuICAgICAgICAgIHZhciBsZW4gPSBvLmxlbmd0aCA+Pj4gMDsgLy8gMy4gSWYgSXNDYWxsYWJsZShwcmVkaWNhdGUpIGlzIGZhbHNlLCB0aHJvdyBhIFR5cGVFcnJvciBleGNlcHRpb24uXG5cbiAgICAgICAgICBpZiAodHlwZW9mIHByZWRpY2F0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZGljYXRlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgIH0gLy8gNC4gSWYgdGhpc0FyZyB3YXMgc3VwcGxpZWQsIGxldCBUIGJlIHRoaXNBcmc7IGVsc2UgbGV0IFQgYmUgdW5kZWZpbmVkLlxuXG5cbiAgICAgICAgICB2YXIgdGhpc0FyZyA9IGFyZ3VtZW50c1sxXTsgLy8gNS4gTGV0IGsgYmUgMC5cblxuICAgICAgICAgIHZhciBrID0gMDsgLy8gNi4gUmVwZWF0LCB3aGlsZSBrIDwgbGVuXG5cbiAgICAgICAgICB3aGlsZSAoayA8IGxlbikge1xuICAgICAgICAgICAgLy8gYS4gTGV0IFBrIGJlICEgVG9TdHJpbmcoaykuXG4gICAgICAgICAgICAvLyBiLiBMZXQga1ZhbHVlIGJlID8gR2V0KE8sIFBrKS5cbiAgICAgICAgICAgIC8vIGMuIExldCB0ZXN0UmVzdWx0IGJlIFRvQm9vbGVhbig/IENhbGwocHJlZGljYXRlLCBULCDCqyBrVmFsdWUsIGssIE8gwrspKS5cbiAgICAgICAgICAgIC8vIGQuIElmIHRlc3RSZXN1bHQgaXMgdHJ1ZSwgcmV0dXJuIGtWYWx1ZS5cbiAgICAgICAgICAgIHZhciBrVmFsdWUgPSBvW2tdO1xuXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlLmNhbGwodGhpc0FyZywga1ZhbHVlLCBrLCBvKSkge1xuICAgICAgICAgICAgICByZXR1cm4ga1ZhbHVlO1xuICAgICAgICAgICAgfSAvLyBlLiBJbmNyZWFzZSBrIGJ5IDEuXG5cblxuICAgICAgICAgICAgaysrO1xuICAgICAgICAgIH0gLy8gNy4gUmV0dXJuIHVuZGVmaW5lZC5cblxuXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUHJvZHVjdGlvbiBzdGVwcyBvZiBFQ01BLTI2MiwgRWRpdGlvbiA2LCAyMi4xLjIuMVxuICAgIGlmICghQXJyYXkuZnJvbSkge1xuICAgICAgQXJyYXkuZnJvbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuICAgICAgICB2YXIgaXNDYWxsYWJsZSA9IGZ1bmN0aW9uIGlzQ2FsbGFibGUoZm4pIHtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nIHx8IHRvU3RyLmNhbGwoZm4pID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciB0b0ludGVnZXIgPSBmdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgICAgICAgICB2YXIgbnVtYmVyID0gTnVtYmVyKHZhbHVlKTtcblxuICAgICAgICAgIGlmIChpc05hTihudW1iZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobnVtYmVyID09PSAwIHx8ICFpc0Zpbml0ZShudW1iZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAobnVtYmVyID4gMCA/IDEgOiAtMSkgKiBNYXRoLmZsb29yKE1hdGguYWJzKG51bWJlcikpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBtYXhTYWZlSW50ZWdlciA9IE1hdGgucG93KDIsIDUzKSAtIDE7XG5cbiAgICAgICAgdmFyIHRvTGVuZ3RoID0gZnVuY3Rpb24gdG9MZW5ndGgodmFsdWUpIHtcbiAgICAgICAgICB2YXIgbGVuID0gdG9JbnRlZ2VyKHZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobGVuLCAwKSwgbWF4U2FmZUludGVnZXIpO1xuICAgICAgICB9OyAvLyBUaGUgbGVuZ3RoIHByb3BlcnR5IG9mIHRoZSBmcm9tIG1ldGhvZCBpcyAxLlxuXG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlXG4gICAgICAgIC8qLCBtYXBGbiwgdGhpc0FyZyAqL1xuICAgICAgICApIHtcbiAgICAgICAgICAvLyAxLiBMZXQgQyBiZSB0aGUgdGhpcyB2YWx1ZS5cbiAgICAgICAgICB2YXIgQyA9IHRoaXM7IC8vIDIuIExldCBpdGVtcyBiZSBUb09iamVjdChhcnJheUxpa2UpLlxuXG4gICAgICAgICAgdmFyIGl0ZW1zID0gT2JqZWN0KGFycmF5TGlrZSk7IC8vIDMuIFJldHVybklmQWJydXB0KGl0ZW1zKS5cblxuICAgICAgICAgIGlmIChhcnJheUxpa2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkuZnJvbSByZXF1aXJlcyBhbiBhcnJheS1saWtlIG9iamVjdCAtIG5vdCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgICAgIH0gLy8gNC4gSWYgbWFwZm4gaXMgdW5kZWZpbmVkLCB0aGVuIGxldCBtYXBwaW5nIGJlIGZhbHNlLlxuXG5cbiAgICAgICAgICB2YXIgbWFwRm4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgdW5kZWZpbmVkO1xuICAgICAgICAgIHZhciBUO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBtYXBGbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIDUuIGVsc2VcbiAgICAgICAgICAgIC8vIDUuIGEgSWYgSXNDYWxsYWJsZShtYXBmbikgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi5cbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZShtYXBGbikpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkuZnJvbTogd2hlbiBwcm92aWRlZCwgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH0gLy8gNS4gYi4gSWYgdGhpc0FyZyB3YXMgc3VwcGxpZWQsIGxldCBUIGJlIHRoaXNBcmc7IGVsc2UgbGV0IFQgYmUgdW5kZWZpbmVkLlxuXG5cbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICBUID0gYXJndW1lbnRzWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gMTAuIExldCBsZW5WYWx1ZSBiZSBHZXQoaXRlbXMsIFwibGVuZ3RoXCIpLlxuICAgICAgICAgIC8vIDExLiBMZXQgbGVuIGJlIFRvTGVuZ3RoKGxlblZhbHVlKS5cblxuXG4gICAgICAgICAgdmFyIGxlbiA9IHRvTGVuZ3RoKGl0ZW1zLmxlbmd0aCk7IC8vIDEzLiBJZiBJc0NvbnN0cnVjdG9yKEMpIGlzIHRydWUsIHRoZW5cbiAgICAgICAgICAvLyAxMy4gYS4gTGV0IEEgYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZFxuICAgICAgICAgIC8vIG9mIEMgd2l0aCBhbiBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcgdGhlIHNpbmdsZSBpdGVtIGxlbi5cbiAgICAgICAgICAvLyAxNC4gYS4gRWxzZSwgTGV0IEEgYmUgQXJyYXlDcmVhdGUobGVuKS5cblxuICAgICAgICAgIHZhciBBID0gaXNDYWxsYWJsZShDKSA/IE9iamVjdChuZXcgQyhsZW4pKSA6IG5ldyBBcnJheShsZW4pOyAvLyAxNi4gTGV0IGsgYmUgMC5cblxuICAgICAgICAgIHZhciBrID0gMDsgLy8gMTcuIFJlcGVhdCwgd2hpbGUgayA8IGxlbuKApiAoYWxzbyBzdGVwcyBhIC0gaClcblxuICAgICAgICAgIHZhciBrVmFsdWU7XG5cbiAgICAgICAgICB3aGlsZSAoayA8IGxlbikge1xuICAgICAgICAgICAga1ZhbHVlID0gaXRlbXNba107XG5cbiAgICAgICAgICAgIGlmIChtYXBGbikge1xuICAgICAgICAgICAgICBBW2tdID0gdHlwZW9mIFQgPT09ICd1bmRlZmluZWQnID8gbWFwRm4oa1ZhbHVlLCBrKSA6IG1hcEZuLmNhbGwoVCwga1ZhbHVlLCBrKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIEFba10gPSBrVmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGsgKz0gMTtcbiAgICAgICAgICB9IC8vIDE4LiBMZXQgcHV0U3RhdHVzIGJlIFB1dChBLCBcImxlbmd0aFwiLCBsZW4sIHRydWUpLlxuXG5cbiAgICAgICAgICBBLmxlbmd0aCA9IGxlbjsgLy8gMjAuIFJldHVybiBBLlxuXG4gICAgICAgICAgcmV0dXJuIEE7XG4gICAgICAgIH07XG4gICAgICB9KCk7XG4gICAgfVxuXG4gICAgdmFyIHdpbiA9IHdpbmRvdztcbiAgICB2YXIgZG9jID0gZG9jdW1lbnQ7XG4gICAgdmFyIGlzVG91Y2hEZXZpY2UgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC8oaVBob25lfGlQb2R8aVBhZHxBbmRyb2lkfHBsYXlib29rfHNpbGt8QmxhY2tCZXJyeXxCQjEwfFdpbmRvd3MgUGhvbmV8VGl6ZW58QmFkYXx3ZWJPU3xJRU1vYmlsZXxPcGVyYSBNaW5pKS8pO1xuICAgIHZhciBpc01hY0RldmljZSA9IC8oTWFjfGlQaG9uZXxpUG9kfGlQYWQpL2kudGVzdCh3aW4ubmF2aWdhdG9yLnVzZXJBZ2VudCk7IC8vIEB0cy1pZ25vcmVcblxuICAgIHZhciBpc1RvdWNoID0gJ29udG91Y2hzdGFydCcgaW4gd2luIHx8IG5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzID4gMCB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHM7XG4gICAgdmFyIGlzSUUxMSA9ICEhd2luZG93Lk1TSW5wdXRNZXRob2RDb250ZXh0ICYmICEhZG9jdW1lbnQuZG9jdW1lbnRNb2RlOyAvLyB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS91ZGFjaXR5L3VkODkxL2Jsb2IvZ2gtcGFnZXMvbGVzc29uMi1mb2N1cy8wNy1tb2RhbHMtYW5kLWtleWJvYXJkLXRyYXBzL3NvbHV0aW9uL21vZGFsLmpzXG5cbiAgICB2YXIgZm9jdXNhYmxlRWxlbWVudHNTdHJpbmcgPSAnYVtocmVmXSwgYXJlYVtocmVmXSwgaW5wdXQ6bm90KFtkaXNhYmxlZF0pLCBzZWxlY3Q6bm90KFtkaXNhYmxlZF0pLCB0ZXh0YXJlYTpub3QoW2Rpc2FibGVkXSksIGJ1dHRvbjpub3QoW2Rpc2FibGVkXSksIGlmcmFtZSwgb2JqZWN0LCBlbWJlZCwgW3RhYmluZGV4PVwiMFwiXSwgW2NvbnRlbnRlZGl0YWJsZV0nOyAvLyBjYWNoZSBjb21tb24gZWxlbWVudHNcblxuICAgIHZhciBGUCA9IHtcbiAgICAgIHRlc3Q6IHt9LFxuICAgICAgc2hhcmVkOiB7fVxuICAgIH07XG4gICAgdmFyIGV4dGVuc2lvbnMgPSBbJ3BhcmFsbGF4JywgJ3Njcm9sbE92ZXJmbG93UmVzZXQnLCAnZHJhZ0FuZE1vdmUnLCAnb2Zmc2V0U2VjdGlvbnMnLCAnZmFkaW5nRWZmZWN0JywgJ3Jlc3BvbnNpdmVTbGlkZXMnLCAnY29udGludW91c0hvcml6b250YWwnLCAnaW50ZXJsb2NrZWRTbGlkZXMnLCAnc2Nyb2xsSG9yaXpvbnRhbGx5JywgJ3Jlc2V0U2xpZGVycycsICdjYXJkcycsICdkcm9wRWZmZWN0JywgJ3dhdGVyRWZmZWN0J107XG5cbiAgICAvKipcbiAgICAqIGZvckVhY2ggcG9seWZpbGwgZm9yIElFXG4gICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZUxpc3QvZm9yRWFjaCNCcm93c2VyX0NvbXBhdGliaWxpdHlcbiAgICAqL1xuXG4gICAgaWYgKHdpbi5Ob2RlTGlzdCAmJiAhTm9kZUxpc3QucHJvdG90eXBlLmZvckVhY2gpIHtcbiAgICAgIE5vZGVMaXN0LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgICAgIHRoaXNBcmcgPSB0aGlzQXJnIHx8IHdpbmRvdztcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXNbaV0sIGksIHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBNdXN0IGJlIHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LCAnYXNzaWduJywge1xuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgdmFyQXJncykge1xuXG4gICAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUeXBlRXJyb3IgaWYgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciB0byA9IE9iamVjdCh0YXJnZXQpO1xuXG4gICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIHZhciBuZXh0U291cmNlID0gYXJndW1lbnRzW2luZGV4XTtcblxuICAgICAgICAgICAgaWYgKG5leHRTb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBTa2lwIG92ZXIgaWYgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBuZXh0U291cmNlKSB7XG4gICAgICAgICAgICAgICAgLy8gQXZvaWQgYnVncyB3aGVuIGhhc093blByb3BlcnR5IGlzIHNoYWRvd2VkXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuZXh0U291cmNlLCBuZXh0S2V5KSkge1xuICAgICAgICAgICAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0bztcbiAgICAgICAgfSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTE3MTk1NTMvcGFkc3RhcnQtbm90LXdvcmtpbmctaW4taWUxMVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZWhuYW1tb2RpL3BvbHlmaWxsL2Jsb2IvbWFzdGVyL3N0cmluZy5wb2x5ZmlsbC5qc1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy9wYWRTdGFydFxuICAgIGlmICghU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydCkge1xuICAgICAgU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydCA9IGZ1bmN0aW9uIHBhZFN0YXJ0KHRhcmdldExlbmd0aCwgcGFkU3RyaW5nKSB7XG4gICAgICAgIHRhcmdldExlbmd0aCA9IHRhcmdldExlbmd0aCA+PiAwOyAvL3RydW5jYXRlIGlmIG51bWJlciBvciBjb252ZXJ0IG5vbi1udW1iZXIgdG8gMDtcblxuICAgICAgICBwYWRTdHJpbmcgPSBTdHJpbmcodHlwZW9mIHBhZFN0cmluZyAhPT0gJ3VuZGVmaW5lZCcgPyBwYWRTdHJpbmcgOiAnICcpO1xuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IHRhcmdldExlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcodGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0TGVuZ3RoID0gdGFyZ2V0TGVuZ3RoIC0gdGhpcy5sZW5ndGg7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0TGVuZ3RoID4gcGFkU3RyaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgcGFkU3RyaW5nICs9IEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHRhcmdldExlbmd0aCkpLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYWRTdHJpbmc7XG4gICAgICAgICAgICB9KS5qb2luKFwiXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBwYWRTdHJpbmcuc2xpY2UoMCwgdGFyZ2V0TGVuZ3RoKSArIFN0cmluZyh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvL3V0aWxzXG4gICAgLyoqXG4gICAgKiBTaG93cyBhIG1lc3NhZ2UgaW4gdGhlIGNvbnNvbGUgb2YgdGhlIGdpdmVuIHR5cGUuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHNob3dFcnJvcih0eXBlLCB0ZXh0KSB7XG4gICAgICB3aW4uY29uc29sZSAmJiB3aW4uY29uc29sZVt0eXBlXSAmJiB3aW4uY29uc29sZVt0eXBlXSgnZnVsbFBhZ2U6ICcgKyB0ZXh0KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNWaXNpYmxlKGVsKSB7XG4gICAgICB2YXIgc3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG4gICAgICByZXR1cm4gc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRWaXNpYmxlKGVsZW1lbnRzKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShlbGVtZW50cykuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBpc1Zpc2libGUoZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBFcXVpdmFsZW50IG9mIGpRdWVyeSBmdW5jdGlvbiAkKCkuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uICQoc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICAgIGNvbnRleHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGNvbnRleHQgOiBkb2N1bWVudDtcbiAgICAgIHJldHVybiBjb250ZXh0ID8gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICogRXh0ZW5kcyBhIGdpdmVuIE9iamVjdCBwcm9wZXJ0aWVzIGFuZCBpdHMgY2hpbGRzLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBkZWVwRXh0ZW5kKG91dCkge1xuICAgICAgb3V0ID0gb3V0IHx8IHt9O1xuXG4gICAgICBmb3IgKHZhciBpID0gMSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgIHZhciBvYmogPSBhcmd1bWVudHNbaV07XG5cbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgICBpZiAoIW9iai5oYXNPd25Qcm9wZXJ0eShrZXkpIHx8IGtleSA9PSAnX19wcm90b19fJyB8fCBrZXkgPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSAvLyBiYXNlZCBvbiBodHRwczovL2phdmFzY3JpcHR3ZWJsb2cud29yZHByZXNzLmNvbS8yMDExLzA4LzA4L2ZpeGluZy10aGUtamF2YXNjcmlwdC10eXBlb2Ytb3BlcmF0b3IvXG5cblxuICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqW2tleV0pID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgICAgICAgb3V0W2tleV0gPSBkZWVwRXh0ZW5kKG91dFtrZXldLCBvYmpba2V5XSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvdXRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICogQ2hlY2tzIGlmIHRoZSBwYXNzZWQgZWxlbWVudCBjb250YWlucyB0aGUgcGFzc2VkIGNsYXNzLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSB7XG4gICAgICBpZiAoZWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBHZXRzIHRoZSB3aW5kb3cgaGVpZ2h0LiBDcm9zc2Jyb3dzZXIuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGdldFdpbmRvd0hlaWdodCgpIHtcbiAgICAgIHJldHVybiAnaW5uZXJIZWlnaHQnIGluIHdpbiA/IHdpbi5pbm5lckhlaWdodCA6IGRvYy5kb2N1bWVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH1cbiAgICAvKipcbiAgICAqIEdldHMgdGhlIHdpbmRvdyB3aWR0aC5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gZ2V0V2luZG93V2lkdGgoKSB7XG4gICAgICByZXR1cm4gd2luLmlubmVyV2lkdGg7XG4gICAgfVxuICAgIC8qKlxuICAgICogU2V0J3MgdGhlIENTUyBwcm9wZXJ0aWVzIGZvciB0aGUgcGFzc2VkIGl0ZW0vcy5cbiAgICAqIEBwYXJhbSB7Tm9kZUxpc3R8SFRNTEVsZW1lbnR8T2JqZWN0fSBpdGVtc1xuICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIGNzcyBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGNzcyhpdGVtcywgcHJvcHMpIHtcbiAgICAgIGl0ZW1zID0gZ2V0TGlzdChpdGVtcyk7XG4gICAgICB2YXIga2V5O1xuXG4gICAgICBmb3IgKGtleSBpbiBwcm9wcykge1xuICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgICAgICAgaXRlbS5zdHlsZVtrZXldID0gcHJvcHNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cbiAgICAvKipcbiAgICAqIEdldHMgdGhlIHByZXZpb3VzIGVsZW1lbnQgdG8gdGhlIHBhc3NlZCBlbGVtZW50LlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBwcmV2KGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICogR2V0cyB0aGUgbmV4dCBlbGVtZW50IHRvIHRoZSBwYXNzZWQgZWxlbWVudC5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gbmV4dChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICogR2V0cyB0aGUgbGFzdCBlbGVtZW50IGZyb20gdGhlIHBhc3NlZCBsaXN0IG9mIGVsZW1lbnRzLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBsYXN0KGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtW2l0ZW0ubGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIC8qKlxuICAgICogR2V0cyBpbmRleCBmcm9tIHRoZSBwYXNzZWQgZWxlbWVudC5cbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBpcyBvcHRpb25hbC5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gaW5kZXgoaXRlbSwgc2VsZWN0b3IpIHtcbiAgICAgIGl0ZW0gPSBpc0FycmF5T3JMaXN0KGl0ZW0pID8gaXRlbVswXSA6IGl0ZW07XG4gICAgICB2YXIgY2hpbGRyZW4gPSBzZWxlY3RvciAhPSBudWxsID8gJChzZWxlY3RvciwgaXRlbS5wYXJlbnROb2RlKSA6IGl0ZW0ucGFyZW50Tm9kZS5jaGlsZE5vZGVzO1xuICAgICAgdmFyIG51bSA9IDA7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IGl0ZW0pIHJldHVybiBudW07XG4gICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PSAxKSBudW0rKztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICAvKipcbiAgICAqIEdldHMgYW4gaXRlcmFibGUgZWxlbWVudCBmb3IgdGhlIHBhc3NlZCBlbGVtZW50L3NcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gZ2V0TGlzdChpdGVtKSB7XG4gICAgICByZXR1cm4gIWlzQXJyYXlPckxpc3QoaXRlbSkgPyBbaXRlbV0gOiBpdGVtO1xuICAgIH1cbiAgICAvKipcbiAgICAqIEFkZHMgdGhlIGRpc3BsYXk9bm9uZSBwcm9wZXJ0eSBmb3IgdGhlIHBhc3NlZCBlbGVtZW50L3NcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gaGlkZShlbCkge1xuICAgICAgZWwgPSBnZXRMaXN0KGVsKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBlbFtpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWw7XG4gICAgfVxuICAgIC8qKlxuICAgICogQWRkcyB0aGUgZGlzcGxheT1ibG9jayBwcm9wZXJ0eSBmb3IgdGhlIHBhc3NlZCBlbGVtZW50L3NcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gc2hvdyhlbCkge1xuICAgICAgZWwgPSBnZXRMaXN0KGVsKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBlbFtpXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVsO1xuICAgIH1cbiAgICAvKipcbiAgICAqIENoZWNrcyBpZiB0aGUgcGFzc2VkIGVsZW1lbnQgaXMgYW4gaXRlcmFibGUgZWxlbWVudCBvciBub3RcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gaXNBcnJheU9yTGlzdChlbCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlbCkgPT09ICdbb2JqZWN0IEFycmF5XScgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVsKSA9PT0gJ1tvYmplY3QgTm9kZUxpc3RdJztcbiAgICB9XG4gICAgLyoqXG4gICAgKiBBZGRzIHRoZSBwYXNzZWQgY2xhc3MgdG8gdGhlIHBhc3NlZCBlbGVtZW50L3NcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gYWRkQ2xhc3MoZWwsIGNsYXNzTmFtZSkge1xuICAgICAgZWwgPSBnZXRMaXN0KGVsKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgaXRlbSA9IGVsW2ldO1xuICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVsO1xuICAgIH1cbiAgICAvKipcbiAgICAqIFJlbW92ZXMgdGhlIHBhc3NlZCBjbGFzcyB0byB0aGUgcGFzc2VkIGVsZW1lbnQvc1xuICAgICogQHBhcmFtIHtTdHJpbmd9IGBjbGFzc05hbWVgIGNhbiBiZSBtdWx0aXBsZSBjbGFzc25hbWVzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsLCBjbGFzc05hbWUpIHtcbiAgICAgIGVsID0gZ2V0TGlzdChlbCk7XG4gICAgICB2YXIgY2xhc3NOYW1lcyA9IGNsYXNzTmFtZS5zcGxpdCgnICcpO1xuXG4gICAgICBmb3IgKHZhciBhID0gMDsgYSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lc1thXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGl0ZW0gPSBlbFtpXTtcbiAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWw7XG4gICAgfVxuICAgIC8qKlxuICAgICogQXBwZW5kcyB0aGUgZ2l2ZW4gZWxlbWVudCBvdCB0aGUgZ2l2ZW4gcGFyZW50LlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBhcHBlbmRUbyhlbCwgcGFyZW50KSB7XG4gICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICBVc2FnZTpcblxuICAgIHZhciB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgd3JhcHBlci5jbGFzc05hbWUgPSAnZnAtc2xpZGVzJztcbiAgICB3cmFwKCQoJy5zbGlkZScpLCB3cmFwcGVyKTtcblxuICAgIGh0dHBzOi8vanNmaWRkbGUubmV0L3F3emM3b3kzLzE1LyAodmFuaWxsYSlcbiAgICBodHRwczovL2pzZmlkZGxlLm5ldC9veWE2bmRrYS8xLyAoanF1ZXJ5IGVxdWl2YWxlbnQpXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHdyYXAodG9XcmFwLCB3cmFwcGVyLCBpc1dyYXBBbGwpIHtcbiAgICAgIHZhciBuZXdQYXJlbnQ7XG4gICAgICB3cmFwcGVyID0gd3JhcHBlciB8fCBkb2MuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9XcmFwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBpdGVtID0gdG9XcmFwW2ldO1xuXG4gICAgICAgIGlmIChpc1dyYXBBbGwgJiYgIWkgfHwgIWlzV3JhcEFsbCkge1xuICAgICAgICAgIG5ld1BhcmVudCA9IHdyYXBwZXIuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgIGl0ZW0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3UGFyZW50LCBpdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld1BhcmVudC5hcHBlbmRDaGlsZChpdGVtKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRvV3JhcDtcbiAgICB9XG4gICAgLyoqXG4gICAgVXNhZ2U6XG4gICAgdmFyIHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB3cmFwcGVyLmNsYXNzTmFtZSA9ICdmcC1zbGlkZXMnO1xuICAgIHdyYXAoJCgnLnNsaWRlJyksIHdyYXBwZXIpO1xuXG4gICAgaHR0cHM6Ly9qc2ZpZGRsZS5uZXQvcXd6YzdveTMvMjcvICh2YW5pbGxhKVxuICAgIGh0dHBzOi8vanNmaWRkbGUubmV0L295YTZuZGthLzQvIChqcXVlcnkgZXF1aXZhbGVudClcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gd3JhcEFsbCh0b1dyYXAsIHdyYXBwZXIpIHtcbiAgICAgIHdyYXAodG9XcmFwLCB3cmFwcGVyLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBVc2FnZTpcbiAgICAqIHdyYXBJbm5lcihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGVwZScpLCAnPGRpdiBjbGFzcz1cInRlc3RcIj5hZmRhczwvZGl2PicpO1xuICAgICogd3JhcElubmVyKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwZXBlJyksIGVsZW1lbnQpO1xuICAgICpcbiAgICAqIGh0dHBzOi8vanNmaWRkbGUubmV0L3pleHh6MHR3LzYvXG4gICAgKlxuICAgICogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIxODE3NTkwLzEwODEzOTZcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gd3JhcElubmVyKHBhcmVudCwgd3JhcHBlcikge1xuICAgICAgcGFyZW50LmFwcGVuZENoaWxkKHdyYXBwZXIpO1xuXG4gICAgICB3aGlsZSAocGFyZW50LmZpcnN0Q2hpbGQgIT09IHdyYXBwZXIpIHtcbiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChwYXJlbnQuZmlyc3RDaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICogVXNhZ2U6XG4gICAgKiB1bndyYXAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BlcGUnKSk7XG4gICAgKiB1bndyYXAoZWxlbWVudCk7XG4gICAgKlxuICAgICogaHR0cHM6Ly9qc2ZpZGRsZS5uZXQvc3pqdDBoeHEvMS9cbiAgICAqXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHVud3JhcCh3cmFwcGVyKSB7XG4gICAgICB2YXIgd3JhcHBlckNvbnRlbnQgPSBkb2MuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG4gICAgICB3aGlsZSAod3JhcHBlci5maXJzdENoaWxkKSB7XG4gICAgICAgIHdyYXBwZXJDb250ZW50LmFwcGVuZENoaWxkKHdyYXBwZXIuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHdyYXBwZXIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQod3JhcHBlckNvbnRlbnQsIHdyYXBwZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjIxMDA4NTMvZG9tLXB1cmUtamF2YXNjcmlwdC1zb2x1dGlvbi10by1qcXVlcnktY2xvc2VzdC1pbXBsZW1lbnRhdGlvblxuICAgICogUmV0dXJucyB0aGUgZWxlbWVudCBvciBgZmFsc2VgIGlmIHRoZXJlJ3Mgbm9uZVxuICAgICovXG5cbiAgICBmdW5jdGlvbiBjbG9zZXN0KGVsLCBzZWxlY3Rvcikge1xuICAgICAgaWYgKGVsICYmIGVsLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGlmIChtYXRjaGVzKGVsLCBzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2xvc2VzdChlbC5wYXJlbnROb2RlLCBzZWxlY3Rvcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAqIFBsYWNlcyBvbmUgZWxlbWVudCAocmVsKSBhZnRlciBhbm90aGVyIG9uZSBvciBncm91cCBvZiB0aGVtIChyZWZlcmVuY2UpLlxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcmVmZXJlbmNlXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fE5vZGVMaXN0fFN0cmluZ3xBcnJheX0gZWxcbiAgICAqIGh0dHBzOi8vanNmaWRkbGUubmV0LzlzOTdoaHp2LzEvXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGFmdGVyKHJlZmVyZW5jZSwgZWwpIHtcbiAgICAgIGluc2VydEJlZm9yZShyZWZlcmVuY2UsIHJlZmVyZW5jZS5uZXh0U2libGluZywgZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAqIFBsYWNlcyBvbmUgZWxlbWVudCAocmVsKSBiZWZvcmUgYW5vdGhlciBvbmUgb3IgZ3JvdXAgb2YgdGhlbSAocmVmZXJlbmNlKS5cbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlZmVyZW5jZVxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudHxOb2RlTGlzdHxTdHJpbmd8QXJyYXl9IGVsXG4gICAgKiBodHRwczovL2pzZmlkZGxlLm5ldC85czk3aGh6di8xL1xuICAgICovXG5cbiAgICBmdW5jdGlvbiBiZWZvcmUocmVmZXJlbmNlLCBlbCkge1xuICAgICAgaW5zZXJ0QmVmb3JlKHJlZmVyZW5jZSwgcmVmZXJlbmNlLCBlbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICogQmFzZWQgaW4gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE5MzE2MDI0LzEwODEzOTZcbiAgICAqIGFuZCBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDc5MzYzMC8xMDgxMzk2XG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGluc2VydEJlZm9yZShyZWZlcmVuY2UsIGJlZm9yZUVsZW1lbnQsIGVsKSB7XG4gICAgICBpZiAoIWlzQXJyYXlPckxpc3QoZWwpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZWwgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBlbCA9IGNyZWF0ZUVsZW1lbnRGcm9tSFRNTChlbCk7XG4gICAgICAgIH1cblxuICAgICAgICBlbCA9IFtlbF07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVmZXJlbmNlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsW2ldLCBiZWZvcmVFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9IC8vaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNDY0ODc2L2phdmFzY3JpcHQtZ2V0LXdpbmRvdy14LXktcG9zaXRpb24tZm9yLXNjcm9sbFxuXG4gICAgZnVuY3Rpb24gZ2V0U2Nyb2xsVG9wKCkge1xuICAgICAgdmFyIGRvY0VsZW1lbnQgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgcmV0dXJuICh3aW4ucGFnZVlPZmZzZXQgfHwgZG9jRWxlbWVudC5zY3JvbGxUb3ApIC0gKGRvY0VsZW1lbnQuY2xpZW50VG9wIHx8IDApO1xuICAgIH1cbiAgICAvKipcbiAgICAqIEdldHMgdGhlIHNpYmxpbmdzIG9mIHRoZSBwYXNzZWQgZWxlbWVudFxuICAgICovXG5cbiAgICBmdW5jdGlvbiBzaWJsaW5ncyhlbCkge1xuICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChlbC5wYXJlbnROb2RlLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkICE9PSBlbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0QXR0cihlbCwgYXR0cikge1xuICAgICAgcmV0dXJuIGVsLmdldEF0dHJpYnV0ZShhdHRyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZG9jQWRkRXZlbnQoZXZlbnQsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgY2FsbGJhY2ssIG9wdGlvbnMgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IG9wdGlvbnMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3aW5kb3dBZGRFdmVudChldmVudCwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBjYWxsYmFjaywgb3B0aW9ucyA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogb3B0aW9ucyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRvY1JlbW92ZUV2ZW50KGV2ZW50LCBjYWxsYmFjaywgb3B0aW9ucykge1xuICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGNhbGxiYWNrLCBvcHRpb25zID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiBvcHRpb25zKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2luZG93UmVtb3ZlRXZlbnQoZXZlbnQsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgY2FsbGJhY2ssIG9wdGlvbnMgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFzc2VkIGl0ZW0gaXMgb2YgZnVuY3Rpb24gdHlwZS5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbihpdGVtKSB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZW0pO1xuICAgICAgcmV0dXJuIHR5cGUgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJztcbiAgICB9XG4gICAgLyoqXG4gICAgKiBUcmlnZ2VyIGN1c3RvbSBldmVudHNcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gdHJpZ2dlcihlbCwgZXZlbnROYW1lLCBkYXRhKSB7XG4gICAgICB2YXIgZXZlbnQ7XG4gICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICd1bmRlZmluZWQnID8ge30gOiBkYXRhOyAvLyBOYXRpdmVcblxuICAgICAgaWYgKHR5cGVvZiB3aW4uQ3VzdG9tRXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBldmVudCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHtcbiAgICAgICAgICBkZXRhaWw6IGRhdGFcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBldmVudCA9IGRvYy5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgICAgICAgZXZlbnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIGVsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAqIFBvbHlmaWxsIG9mIC5tYXRjaGVzKClcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gbWF0Y2hlcyhlbCwgc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiAoZWwubWF0Y2hlcyB8fCBlbC5tYXRjaGVzU2VsZWN0b3IgfHwgZWwubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWwubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbC5vTWF0Y2hlc1NlbGVjdG9yKS5jYWxsKGVsLCBzZWxlY3Rvcik7XG4gICAgfVxuICAgIC8qKlxuICAgICogVG9nZ2xlcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgcGFzc2VkIGVsZW1lbnQgZWwuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHRvZ2dsZShlbCwgdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBlbFtpXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgICAgICB9XG4gICAgICB9IC8vd2UgZG9uJ3QgdXNlIGl0IGluIG90aGVyIHdheSwgc28gbm8gZWxzZSA6KVxuXG5cbiAgICAgIHJldHVybiBlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBDcmVhdGVzIGEgSFRNTEVsZW1lbnQgZnJvbSB0aGUgcGFzc2VkIEhUTUwgc3RyaW5nLlxuICAgICogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ5NDM0OC8xMDgxMzk2XG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRGcm9tSFRNTChodG1sU3RyaW5nKSB7XG4gICAgICB2YXIgZGl2ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZGl2LmlubmVySFRNTCA9IGh0bWxTdHJpbmcudHJpbSgpOyAvLyBDaGFuZ2UgdGhpcyB0byBkaXYuY2hpbGROb2RlcyB0byBzdXBwb3J0IG11bHRpcGxlIHRvcC1sZXZlbCBub2Rlc1xuXG4gICAgICByZXR1cm4gZGl2LmZpcnN0Q2hpbGQ7XG4gICAgfVxuICAgIC8qKlxuICAgICogUmVtb3ZlcyB0aGUgcGFzc2VkIGl0ZW0vcyBmcm9tIHRoZSBET00uXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHJlbW92ZShpdGVtcykge1xuICAgICAgaXRlbXMgPSBnZXRMaXN0KGl0ZW1zKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldO1xuXG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0ucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgIGl0ZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy9odHRwczovL2pzZmlkZGxlLm5ldC93MXJrdGVjei9cblxuICAgIGZ1bmN0aW9uIHVudGlsQWxsKGl0ZW0sIHNlbGVjdG9yLCBmbikge1xuICAgICAgdmFyIHNpYmxpbmcgPSBpdGVtW2ZuXTtcbiAgICAgIHZhciBzaWJsaW5ncyA9IFtdO1xuXG4gICAgICB3aGlsZSAoc2libGluZykge1xuICAgICAgICBpZiAobWF0Y2hlcyhzaWJsaW5nLCBzZWxlY3RvcikgfHwgc2VsZWN0b3IgPT0gbnVsbCkge1xuICAgICAgICAgIHNpYmxpbmdzLnB1c2goc2libGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzaWJsaW5nID0gc2libGluZ1tmbl07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzaWJsaW5ncztcbiAgICB9XG4gICAgLyoqXG4gICAgKiBHZXRzIGFsbCBuZXh0IGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBwYXNzZWQgc2VsZWN0b3IuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIG5leHRBbGwoaXRlbSwgc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiB1bnRpbEFsbChpdGVtLCBzZWxlY3RvciwgJ25leHRFbGVtZW50U2libGluZycpO1xuICAgIH1cbiAgICAvKipcbiAgICAqIEdldHMgYWxsIHByZXZpb3VzIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBwYXNzZWQgc2VsZWN0b3IuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHByZXZBbGwoaXRlbSwgc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiB1bnRpbEFsbChpdGVtLCBzZWxlY3RvciwgJ3ByZXZpb3VzRWxlbWVudFNpYmxpbmcnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBDb252ZXJ0cyBhbiBvYmplY3QgdG8gYW4gYXJyYXkuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHRvQXJyYXkob2JqZWN0RGF0YSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdERhdGEpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBvYmplY3REYXRhW2tleV07XG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0TGFzdChpdGVtcykge1xuICAgICAgcmV0dXJuIGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICAvKipcbiAgICAqIEdldHMgdGhlIGF2ZXJhZ2Ugb2YgdGhlIGxhc3QgYG51bWJlcmAgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5LlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBnZXRBdmVyYWdlKGVsZW1lbnRzLCBudW1iZXIpIHtcbiAgICAgIHZhciBzdW0gPSAwOyAvL3Rha2luZyBgbnVtYmVyYCBlbGVtZW50cyBmcm9tIHRoZSBlbmQgdG8gbWFrZSB0aGUgYXZlcmFnZSwgaWYgdGhlcmUgYXJlIG5vdCBlbm91Z2h0LCAxXG5cbiAgICAgIHZhciBsYXN0RWxlbWVudHMgPSBlbGVtZW50cy5zbGljZShNYXRoLm1heChlbGVtZW50cy5sZW5ndGggLSBudW1iZXIsIDEpKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0RWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3VtID0gc3VtICsgbGFzdEVsZW1lbnRzW2ldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTWF0aC5jZWlsKHN1bSAvIG51bWJlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgZnJvbSB0aGUgYGRhdGEtYCBhdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSBzdWZmaXhcbiAgICAqIGllOiBkYXRhLXNyY3NldCA9PT4gc3Jjc2V0ICB8ICBkYXRhLXNyYyA9PT4gc3JjXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHNldFNyYyhlbGVtZW50LCBhdHRyaWJ1dGUpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgZ2V0QXR0cihlbGVtZW50LCAnZGF0YS0nICsgYXR0cmlidXRlKSk7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS0nICsgYXR0cmlidXRlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0UGFyZW50c1VudGlsKGl0ZW0sIHRvcFBhcmVudFNlbGVjdG9yKSB7XG4gICAgICB2YXIgcGFyZW50cyA9IFtpdGVtXTtcblxuICAgICAgZG8ge1xuICAgICAgICBpdGVtID0gaXRlbS5wYXJlbnROb2RlO1xuICAgICAgICBwYXJlbnRzLnB1c2goaXRlbSk7XG4gICAgICB9IHdoaWxlICghbWF0Y2hlcyhpdGVtLCB0b3BQYXJlbnRTZWxlY3RvcikpO1xuXG4gICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNJbnNpZGVJbnB1dCgpIHtcbiAgICAgIHZhciBhY3RpdmVFbGVtZW50ID0gZG9jLmFjdGl2ZUVsZW1lbnQ7XG4gICAgICByZXR1cm4gbWF0Y2hlcyhhY3RpdmVFbGVtZW50LCAndGV4dGFyZWEnKSB8fCBtYXRjaGVzKGFjdGl2ZUVsZW1lbnQsICdpbnB1dCcpIHx8IG1hdGNoZXMoYWN0aXZlRWxlbWVudCwgJ3NlbGVjdCcpIHx8IGdldEF0dHIoYWN0aXZlRWxlbWVudCwgJ2NvbnRlbnRFZGl0YWJsZScpID09IFwidHJ1ZVwiIHx8IGdldEF0dHIoYWN0aXZlRWxlbWVudCwgJ2NvbnRlbnRFZGl0YWJsZScpID09ICcnO1xuICAgIH0gLy91dGlscyBhcmUgcHVibGljLCBzbyB3ZSBjYW4gdXNlIGl0IHdoZXJldmVyIHdlIHdhbnRcbiAgICAvLyBAdHMtaWdub3JlXG5cbiAgICB3aW5kb3dbXCJmcF91dGlsc1wiXSA9IHtcbiAgICAgIFwiJFwiOiAkLFxuICAgICAgXCJkZWVwRXh0ZW5kXCI6IGRlZXBFeHRlbmQsXG4gICAgICBcImhhc0NsYXNzXCI6IGhhc0NsYXNzLFxuICAgICAgXCJnZXRXaW5kb3dIZWlnaHRcIjogZ2V0V2luZG93SGVpZ2h0LFxuICAgICAgXCJjc3NcIjogY3NzLFxuICAgICAgXCJwcmV2XCI6IHByZXYsXG4gICAgICBcIm5leHRcIjogbmV4dCxcbiAgICAgIFwibGFzdFwiOiBsYXN0LFxuICAgICAgXCJpbmRleFwiOiBpbmRleCxcbiAgICAgIFwiZ2V0TGlzdFwiOiBnZXRMaXN0LFxuICAgICAgXCJoaWRlXCI6IGhpZGUsXG4gICAgICBcInNob3dcIjogc2hvdyxcbiAgICAgIFwiaXNBcnJheU9yTGlzdFwiOiBpc0FycmF5T3JMaXN0LFxuICAgICAgXCJhZGRDbGFzc1wiOiBhZGRDbGFzcyxcbiAgICAgIFwicmVtb3ZlQ2xhc3NcIjogcmVtb3ZlQ2xhc3MsXG4gICAgICBcImFwcGVuZFRvXCI6IGFwcGVuZFRvLFxuICAgICAgXCJ3cmFwXCI6IHdyYXAsXG4gICAgICBcIndyYXBBbGxcIjogd3JhcEFsbCxcbiAgICAgIFwidW53cmFwXCI6IHVud3JhcCxcbiAgICAgIFwiY2xvc2VzdFwiOiBjbG9zZXN0LFxuICAgICAgXCJhZnRlclwiOiBhZnRlcixcbiAgICAgIFwiYmVmb3JlXCI6IGJlZm9yZSxcbiAgICAgIFwiaW5zZXJ0QmVmb3JlXCI6IGluc2VydEJlZm9yZSxcbiAgICAgIFwiZ2V0U2Nyb2xsVG9wXCI6IGdldFNjcm9sbFRvcCxcbiAgICAgIFwic2libGluZ3NcIjogc2libGluZ3MsXG4gICAgICBcInByZXZlbnREZWZhdWx0XCI6IHByZXZlbnREZWZhdWx0LFxuICAgICAgXCJpc0Z1bmN0aW9uXCI6IGlzRnVuY3Rpb24sXG4gICAgICBcInRyaWdnZXJcIjogdHJpZ2dlcixcbiAgICAgIFwibWF0Y2hlc1wiOiBtYXRjaGVzLFxuICAgICAgXCJ0b2dnbGVcIjogdG9nZ2xlLFxuICAgICAgXCJjcmVhdGVFbGVtZW50RnJvbUhUTUxcIjogY3JlYXRlRWxlbWVudEZyb21IVE1MLFxuICAgICAgXCJyZW1vdmVcIjogcmVtb3ZlLFxuICAgICAgLy8gXCJmaWx0ZXJcIjogZmlsdGVyLFxuICAgICAgXCJ1bnRpbEFsbFwiOiB1bnRpbEFsbCxcbiAgICAgIFwibmV4dEFsbFwiOiBuZXh0QWxsLFxuICAgICAgXCJwcmV2QWxsXCI6IHByZXZBbGwsXG4gICAgICBcInNob3dFcnJvclwiOiBzaG93RXJyb3JcbiAgICB9O1xuXG4gICAgdmFyIHV0aWxzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgIHNob3dFcnJvcjogc2hvd0Vycm9yLFxuICAgICAgICBpc1Zpc2libGU6IGlzVmlzaWJsZSxcbiAgICAgICAgZ2V0VmlzaWJsZTogZ2V0VmlzaWJsZSxcbiAgICAgICAgJDogJCxcbiAgICAgICAgZGVlcEV4dGVuZDogZGVlcEV4dGVuZCxcbiAgICAgICAgaGFzQ2xhc3M6IGhhc0NsYXNzLFxuICAgICAgICBnZXRXaW5kb3dIZWlnaHQ6IGdldFdpbmRvd0hlaWdodCxcbiAgICAgICAgZ2V0V2luZG93V2lkdGg6IGdldFdpbmRvd1dpZHRoLFxuICAgICAgICBjc3M6IGNzcyxcbiAgICAgICAgcHJldjogcHJldixcbiAgICAgICAgbmV4dDogbmV4dCxcbiAgICAgICAgbGFzdDogbGFzdCxcbiAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICBnZXRMaXN0OiBnZXRMaXN0LFxuICAgICAgICBoaWRlOiBoaWRlLFxuICAgICAgICBzaG93OiBzaG93LFxuICAgICAgICBpc0FycmF5T3JMaXN0OiBpc0FycmF5T3JMaXN0LFxuICAgICAgICBhZGRDbGFzczogYWRkQ2xhc3MsXG4gICAgICAgIHJlbW92ZUNsYXNzOiByZW1vdmVDbGFzcyxcbiAgICAgICAgYXBwZW5kVG86IGFwcGVuZFRvLFxuICAgICAgICB3cmFwOiB3cmFwLFxuICAgICAgICB3cmFwQWxsOiB3cmFwQWxsLFxuICAgICAgICB3cmFwSW5uZXI6IHdyYXBJbm5lcixcbiAgICAgICAgdW53cmFwOiB1bndyYXAsXG4gICAgICAgIGNsb3Nlc3Q6IGNsb3Nlc3QsXG4gICAgICAgIGFmdGVyOiBhZnRlcixcbiAgICAgICAgYmVmb3JlOiBiZWZvcmUsXG4gICAgICAgIGluc2VydEJlZm9yZTogaW5zZXJ0QmVmb3JlLFxuICAgICAgICBnZXRTY3JvbGxUb3A6IGdldFNjcm9sbFRvcCxcbiAgICAgICAgc2libGluZ3M6IHNpYmxpbmdzLFxuICAgICAgICBwcmV2ZW50RGVmYXVsdDogcHJldmVudERlZmF1bHQsXG4gICAgICAgIGdldEF0dHI6IGdldEF0dHIsXG4gICAgICAgIGRvY0FkZEV2ZW50OiBkb2NBZGRFdmVudCxcbiAgICAgICAgd2luZG93QWRkRXZlbnQ6IHdpbmRvd0FkZEV2ZW50LFxuICAgICAgICBkb2NSZW1vdmVFdmVudDogZG9jUmVtb3ZlRXZlbnQsXG4gICAgICAgIHdpbmRvd1JlbW92ZUV2ZW50OiB3aW5kb3dSZW1vdmVFdmVudCxcbiAgICAgICAgaXNGdW5jdGlvbjogaXNGdW5jdGlvbixcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlcixcbiAgICAgICAgbWF0Y2hlczogbWF0Y2hlcyxcbiAgICAgICAgdG9nZ2xlOiB0b2dnbGUsXG4gICAgICAgIGNyZWF0ZUVsZW1lbnRGcm9tSFRNTDogY3JlYXRlRWxlbWVudEZyb21IVE1MLFxuICAgICAgICByZW1vdmU6IHJlbW92ZSxcbiAgICAgICAgdW50aWxBbGw6IHVudGlsQWxsLFxuICAgICAgICBuZXh0QWxsOiBuZXh0QWxsLFxuICAgICAgICBwcmV2QWxsOiBwcmV2QWxsLFxuICAgICAgICB0b0FycmF5OiB0b0FycmF5LFxuICAgICAgICBnZXRMYXN0OiBnZXRMYXN0LFxuICAgICAgICBnZXRBdmVyYWdlOiBnZXRBdmVyYWdlLFxuICAgICAgICBzZXRTcmM6IHNldFNyYyxcbiAgICAgICAgZ2V0UGFyZW50c1VudGlsOiBnZXRQYXJlbnRzVW50aWwsXG4gICAgICAgIGlzSW5zaWRlSW5wdXQ6IGlzSW5zaWRlSW5wdXRcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbiAgICB9XG5cbiAgICB2YXIgRXZlbnRFbWl0dGVyID0ge1xuICAgICAgZXZlbnRzOiB7fSxcbiAgICAgIG9uOiBmdW5jdGlvbiBvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICBpZiAoX3R5cGVvZih0aGlzLmV2ZW50c1tldmVudF0pICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHRoaXMuZXZlbnRzW2V2ZW50XSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHNbZXZlbnRdLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUxpc3RlbmVyOiBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKF90eXBlb2YodGhpcy5ldmVudHNbZXZlbnRdKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB2YXIgaWR4ID0gdGhpcy5ldmVudHNbZXZlbnRdLmluZGV4T2YobGlzdGVuZXIpO1xuXG4gICAgICAgICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50c1tldmVudF0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZW1pdDogZnVuY3Rpb24gZW1pdChldmVudCkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3R5cGVvZih0aGlzLmV2ZW50c1tldmVudF0pID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHRoaXMuZXZlbnRzW2V2ZW50XS5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyLmFwcGx5KF90aGlzMiwgYXJncyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbmNlOiBmdW5jdGlvbiBvbmNlKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgICB2YXIgcmVtb3ZlID0gdGhpcy5vbihldmVudCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJlbW92ZSgpO1xuXG4gICAgICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXIuYXBwbHkoX3RoaXMzLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgIG51bVNlY3Rpb25zOiAwLFxuICAgICAgbnVtU2xpZGVzOiAwLFxuICAgICAgc2xpZGVzOiBbXSxcbiAgICAgIHNlY3Rpb25zOiBbXSxcbiAgICAgIGFjdGl2ZVNlY3Rpb246IG51bGwsXG4gICAgICBzY3JvbGxUcmlnZ2VyOiBudWxsLFxuICAgICAgaXNCZXlvbmRGdWxscGFnZTogZmFsc2UsXG4gICAgICBhYm91dFRvU2Nyb2xsVG9GdWxsUGFnZTogZmFsc2UsXG4gICAgICBzbGlkZU1vdmluZzogZmFsc2UsXG4gICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgIGlzU2Nyb2xsaW5nOiBmYWxzZSxcbiAgICAgIGxhc3RTY3JvbGxlZERlc3Rpbnk6IHVuZGVmaW5lZCxcbiAgICAgIGxhc3RTY3JvbGxlZFNsaWRlOiB1bmRlZmluZWQsXG4gICAgICBhY3RpdmVBbmltYXRpb246IGZhbHNlLFxuICAgICAgY2FuU2Nyb2xsOiB0cnVlLFxuICAgICAgdG91Y2hEaXJlY3Rpb246ICdub25lJyxcbiAgICAgIHdoZWVsRGlyZWN0aW9uOiAnbm9uZScsXG4gICAgICBpc0dyYWJiaW5nOiBmYWxzZSxcbiAgICAgIGlzVXNpbmdXaGVlbDogZmFsc2UsXG4gICAgICBpc1dpbmRvd0ZvY3VzZWQ6IHRydWUsXG4gICAgICBwcmV2aW91c0Rlc3RUb3A6IDAsXG4gICAgICB3aW5kb3dzSGVpZ2h0OiBnZXRXaW5kb3dIZWlnaHQoKSxcbiAgICAgIGlzRG9pbmdDb250aW5vdXNWZXJ0aWNhbDogZmFsc2UsXG4gICAgICB0aW1lb3V0czoge30sXG4gICAgICBzY3JvbGxZOiAwLFxuICAgICAgc2Nyb2xsWDogMFxuICAgIH07IC8vIEB0cy1pZ25vcmVcblxuICAgIHdpbi5zdGF0ZSA9IHN0YXRlO1xuICAgIGZ1bmN0aW9uIHNldFN0YXRlKHByb3BzKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHN0YXRlLCBwcm9wcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRBY3RpdmVQYW5lbCgpIHtcbiAgICAgIHJldHVybiBzdGF0ZS5hY3RpdmVTZWN0aW9uICYmIHN0YXRlLmFjdGl2ZVNlY3Rpb24uYWN0aXZlU2xpZGUgPyBzdGF0ZS5hY3RpdmVTZWN0aW9uLmFjdGl2ZVNsaWRlIDogc3RhdGUuYWN0aXZlU2VjdGlvbjtcbiAgICB9XG5cbiAgICB2YXIgZXZlbnRzID0ge1xuICAgICAgb25BZnRlclJlbmRlck5vQW5jaG9yOiAnb25BZnRlclJlbmRlck5vQW5jaG9yJyxcbiAgICAgIG9uQ2xpY2tPclRvdWNoOiAnb25DbGlja09yVG91Y2gnLFxuICAgICAgbW92ZVNsaWRlTGVmdDogJ21vdmVTbGlkZUxlZnQnLFxuICAgICAgbW92ZVNsaWRlUmlnaHQ6ICdtb3ZlU2xpZGVSaWdodCcsXG4gICAgICBvbkluaXRpYWxpc2U6ICdvbkluaXRpYWxpc2UnLFxuICAgICAgYmVmb3JlSW5pdDogJ2JlZm9yZUluaXQnLFxuICAgICAgYmluZEV2ZW50czogJ2JpbmRFdmVudHMnLFxuICAgICAgb25EZXN0cm95OiAnb25EZXN0cm95JyxcbiAgICAgIGNvbnRlbnRDaGFuZ2VkOiAnY29udGVudENoYW5nZWQnLFxuICAgICAgb25TY3JvbGxPdmVyZmxvd1Njcm9sbGVkOiAnb25TY3JvbGxPdmVyZmxvd1Njcm9sbGVkJyxcbiAgICAgIG9uU2Nyb2xsUGFnZUFuZFNsaWRlOiAnb25TY3JvbGxQYWdlQW5kU2xpZGUnLFxuICAgICAgb25LZXlEb3duOiAnb25LZXlEb3duJyxcbiAgICAgIG9uTWVudUNsaWNrOiAnb25NZW51Q2xpY2snLFxuICAgICAgc2Nyb2xsUGFnZTogJ3Njcm9sbFBhZ2UnLFxuICAgICAgbGFuZHNjYXBlU2Nyb2xsOiAnbGFuZHNjYXBlU2Nyb2xsJyxcbiAgICAgIHNjcm9sbEJleW9uZEZ1bGxwYWdlOiAnc2Nyb2xsQmV5b25kRnVsbHBhZ2UnLFxuICAgICAgb25QZXJmb3JtTW92ZW1lbnQ6ICdvblBlcmZvcm1Nb3ZlbWVudCcsXG4gICAgICBvblNsaWRlTGVhdmU6ICdvblNsaWRlTGVhdmUnLFxuICAgICAgb25MZWF2ZTogJ29uTGVhdmUnLFxuICAgICAgYWZ0ZXJTZWN0aW9uTG9hZHM6ICdhZnRlclNlY3Rpb25Mb2FkcycsXG4gICAgICBhZnRlclNsaWRlTG9hZHM6ICdhZnRlclNsaWRlTG9hZHMnXG4gICAgfTtcblxuICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMuYmluZEV2ZW50cywgYmluZEV2ZW50cyRjKTtcblxuICAgIGZ1bmN0aW9uIGJpbmRFdmVudHMkYygpIHtcbiAgICAgIC8vU2Nyb2xscyB0byB0aGUgc2VjdGlvbiB3aGVuIGNsaWNraW5nIHRoZSBuYXZpZ2F0aW9uIGJ1bGxldFxuICAgICAgLy9zaW11bGF0aW5nIHRoZSBqUXVlcnkgLm9uKCdjbGljaycpIGV2ZW50IHVzaW5nIGRlbGVnYXRpb25cbiAgICAgIFsnY2xpY2snLCAndG91Y2hzdGFydCddLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICBkb2NBZGRFdmVudChldmVudE5hbWUsIGRlbGVnYXRlZEV2ZW50cyk7XG4gICAgICB9KTtcbiAgICAgIHdpbmRvd0FkZEV2ZW50KCdmb2N1cycsIGZvY3VzSGFuZGxlcik7XG4gICAgICBpbnRlcm5hbEV2ZW50cygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGludGVybmFsRXZlbnRzKCkge1xuICAgICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50cy5vbkRlc3Ryb3ksIG9uRGVzdHJveSQ5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWxlZ2F0ZWRFdmVudHMoZSkge1xuICAgICAgRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRzLm9uQ2xpY2tPclRvdWNoLCB7XG4gICAgICAgIGU6IGUsXG4gICAgICAgIHRhcmdldDogZS50YXJnZXRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uRGVzdHJveSQ5KCkge1xuICAgICAgWydjbGljaycsICd0b3VjaHN0YXJ0J10uZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgIGRvY1JlbW92ZUV2ZW50KGV2ZW50TmFtZSwgZGVsZWdhdGVkRXZlbnRzKTtcbiAgICAgIH0pO1xuICAgIH0gLy8gY2hhbmdpbmcgaXNXaW5kb3dGb2N1c2VkIHRvIHRydWUgb24gZm9jdXMgZXZlbnRcblxuXG4gICAgZnVuY3Rpb24gZm9jdXNIYW5kbGVyKCkge1xuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICBpc1dpbmRvd0ZvY3VzZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGtlZXBpbmcgY2VudHJhbCBzZXQgb2YgY2xhc3NuYW1lcyBhbmQgc2VsZWN0b3JzXG4gICAgdmFyIFdSQVBQRVIgPSAnZnVsbHBhZ2Utd3JhcHBlcic7XG4gICAgdmFyIFdSQVBQRVJfU0VMID0gJy4nICsgV1JBUFBFUjsgLy8gc2xpbXNjcm9sbFxuXG4gICAgdmFyIFNDUk9MTEFCTEUgPSAnZnAtc2Nyb2xsYWJsZSc7XG5cbiAgICB2YXIgUkVTUE9OU0lWRSA9ICdmcC1yZXNwb25zaXZlJztcbiAgICB2YXIgTk9fVFJBTlNJVElPTiA9ICdmcC1ub3RyYW5zaXRpb24nO1xuICAgIHZhciBERVNUUk9ZRUQgPSAnZnAtZGVzdHJveWVkJztcbiAgICB2YXIgRU5BQkxFRCA9ICdmcC1lbmFibGVkJztcbiAgICB2YXIgVklFV0lOR19QUkVGSVggPSAnZnAtdmlld2luZyc7XG4gICAgdmFyIEFDVElWRSA9ICdhY3RpdmUnO1xuICAgIHZhciBBQ1RJVkVfU0VMID0gJy4nICsgQUNUSVZFO1xuICAgIHZhciBDT01QTEVURUxZID0gJ2ZwLWNvbXBsZXRlbHknO1xuICAgIHZhciBDT01QTEVURUxZX1NFTCA9ICcuJyArIENPTVBMRVRFTFk7IC8vIHNlY3Rpb25cblxuICAgIHZhciBTRUNUSU9OX0RFRkFVTFRfU0VMID0gJy5zZWN0aW9uJztcbiAgICB2YXIgU0VDVElPTiA9ICdmcC1zZWN0aW9uJztcbiAgICB2YXIgU0VDVElPTl9TRUwgPSAnLicgKyBTRUNUSU9OO1xuICAgIHZhciBTRUNUSU9OX0FDVElWRV9TRUwgPSBTRUNUSU9OX1NFTCArIEFDVElWRV9TRUw7XG4gICAgdmFyIFRBQkxFX0NFTEwgPSAnZnAtdGFibGVDZWxsJztcbiAgICB2YXIgVEFCTEVfQ0VMTF9TRUwgPSAnLicgKyBUQUJMRV9DRUxMO1xuICAgIHZhciBBVVRPX0hFSUdIVCA9ICdmcC1hdXRvLWhlaWdodCc7XG4gICAgdmFyIEFVVE9fSEVJR0hUX1NFTCA9ICcuJyArIEFVVE9fSEVJR0hUO1xuICAgIHZhciBBVVRPX0hFSUdIVF9SRVNQT05TSVZFID0gJ2ZwLWF1dG8taGVpZ2h0LXJlc3BvbnNpdmUnO1xuICAgIHZhciBBVVRPX0hFSUdIVF9SRVNQT05TSVZFX1NFTCA9ICcuJyArIEFVVE9fSEVJR0hUX1JFU1BPTlNJVkU7XG4gICAgdmFyIE5PUk1BTF9TQ1JPTEwgPSAnZnAtbm9ybWFsLXNjcm9sbCc7XG5cbiAgICB2YXIgU0VDVElPTl9OQVYgPSAnZnAtbmF2JztcbiAgICB2YXIgU0VDVElPTl9OQVZfU0VMID0gJyMnICsgU0VDVElPTl9OQVY7XG4gICAgdmFyIFNFQ1RJT05fTkFWX1RPT0xUSVAgPSAnZnAtdG9vbHRpcCc7XG4gICAgdmFyIFNFQ1RJT05fTkFWX1RPT0xUSVBfU0VMID0gJy4nICsgU0VDVElPTl9OQVZfVE9PTFRJUDtcbiAgICB2YXIgU0hPV19BQ1RJVkVfVE9PTFRJUCA9ICdmcC1zaG93LWFjdGl2ZSc7IC8vIHNsaWRlXG5cbiAgICB2YXIgU0xJREVfREVGQVVMVF9TRUwgPSAnLnNsaWRlJztcbiAgICB2YXIgU0xJREUgPSAnZnAtc2xpZGUnO1xuICAgIHZhciBTTElERV9TRUwgPSAnLicgKyBTTElERTtcbiAgICB2YXIgU0xJREVfQUNUSVZFX1NFTCA9IFNMSURFX1NFTCArIEFDVElWRV9TRUw7XG4gICAgdmFyIFNMSURFU19XUkFQUEVSID0gJ2ZwLXNsaWRlcyc7XG4gICAgdmFyIFNMSURFU19XUkFQUEVSX1NFTCA9ICcuJyArIFNMSURFU19XUkFQUEVSO1xuICAgIHZhciBTTElERVNfQ09OVEFJTkVSID0gJ2ZwLXNsaWRlc0NvbnRhaW5lcic7XG4gICAgdmFyIFNMSURFU19DT05UQUlORVJfU0VMID0gJy4nICsgU0xJREVTX0NPTlRBSU5FUjtcbiAgICB2YXIgVEFCTEUgPSAnZnAtdGFibGUnO1xuICAgIHZhciBPVkVSRkxPVyA9ICdmcC1vdmVyZmxvdyc7XG4gICAgdmFyIE9WRVJGTE9XX1NFTCA9ICcuJyArIE9WRVJGTE9XO1xuICAgIHZhciBJU19PVkVSRkxPVyA9ICdmcC1pcy1vdmVyZmxvdyc7IC8vIHNsaWRlIG5hdlxuXG4gICAgdmFyIFNMSURFU19OQVYgPSAnZnAtc2xpZGVzTmF2JztcbiAgICB2YXIgU0xJREVTX05BVl9TRUwgPSAnLicgKyBTTElERVNfTkFWO1xuICAgIHZhciBTTElERVNfTkFWX0xJTktfU0VMID0gU0xJREVTX05BVl9TRUwgKyAnIGEnO1xuICAgIHZhciBTTElERVNfU1RZTEVEX0FSUk9XID0gJ2ZwLWFycm93JztcbiAgICB2YXIgU0xJREVTX0FSUk9XID0gJ2ZwLWNvbnRyb2xBcnJvdyc7XG4gICAgdmFyIFNMSURFU19BUlJPV19TRUwgPSAnLicgKyBTTElERVNfQVJST1c7XG4gICAgdmFyIFNMSURFU19QUkVWID0gJ2ZwLXByZXYnO1xuICAgIHZhciBTTElERVNfUFJFVl9TRUwgPSAnLicgKyBTTElERVNfUFJFVjtcbiAgICB2YXIgU0xJREVTX0FSUk9XX1BSRVZfU0VMID0gU0xJREVTX0FSUk9XX1NFTCArIFNMSURFU19QUkVWX1NFTDtcbiAgICB2YXIgU0xJREVTX05FWFQgPSAnZnAtbmV4dCc7XG4gICAgdmFyIFNMSURFU19ORVhUX1NFTCA9ICcuJyArIFNMSURFU19ORVhUO1xuICAgIHZhciBTTElERVNfQVJST1dfTkVYVF9TRUwgPSBTTElERVNfQVJST1dfU0VMICsgU0xJREVTX05FWFRfU0VMO1xuXG4gICAgdmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgLy9uYXZpZ2F0aW9uXG4gICAgICBtZW51OiBmYWxzZSxcbiAgICAgIGFuY2hvcnM6IFtdLFxuICAgICAgbG9ja0FuY2hvcnM6IGZhbHNlLFxuICAgICAgbmF2aWdhdGlvbjogZmFsc2UsXG4gICAgICBuYXZpZ2F0aW9uUG9zaXRpb246ICdyaWdodCcsXG4gICAgICBuYXZpZ2F0aW9uVG9vbHRpcHM6IFtdLFxuICAgICAgc2hvd0FjdGl2ZVRvb2x0aXA6IGZhbHNlLFxuICAgICAgc2xpZGVzTmF2aWdhdGlvbjogZmFsc2UsXG4gICAgICBzbGlkZXNOYXZQb3NpdGlvbjogJ2JvdHRvbScsXG4gICAgICBzY3JvbGxCYXI6IGZhbHNlLFxuICAgICAgaHlicmlkOiBmYWxzZSxcbiAgICAgIGxpY2Vuc2VLZXk6ICcnLFxuICAgICAgY3JlZGl0czoge1xuICAgICAgICBcImVuYWJsZWRcIjogdHJ1ZSxcbiAgICAgICAgXCJsYWJlbFwiOiAnTWFkZSB3aXRoIGZ1bGxQYWdlLmpzJyxcbiAgICAgICAgXCJwb3NpdGlvblwiOiAncmlnaHQnXG4gICAgICB9LFxuICAgICAgLy9zY3JvbGxpbmdcbiAgICAgIGNzczM6IHRydWUsXG4gICAgICBzY3JvbGxpbmdTcGVlZDogNzAwLFxuICAgICAgYXV0b1Njcm9sbGluZzogdHJ1ZSxcbiAgICAgIGZpdFRvU2VjdGlvbjogdHJ1ZSxcbiAgICAgIGZpdFRvU2VjdGlvbkRlbGF5OiA2MDAsXG4gICAgICBlYXNpbmc6ICdlYXNlSW5PdXRDdWJpYycsXG4gICAgICBlYXNpbmdjc3MzOiAnZWFzZScsXG4gICAgICBsb29wQm90dG9tOiBmYWxzZSxcbiAgICAgIGxvb3BUb3A6IGZhbHNlLFxuICAgICAgbG9vcEhvcml6b250YWw6IHRydWUsXG4gICAgICBjb250aW51b3VzVmVydGljYWw6IGZhbHNlLFxuICAgICAgY29udGludW91c0hvcml6b250YWw6IGZhbHNlLFxuICAgICAgc2Nyb2xsSG9yaXpvbnRhbGx5OiBmYWxzZSxcbiAgICAgIGludGVybG9ja2VkU2xpZGVzOiBmYWxzZSxcbiAgICAgIGRyYWdBbmRNb3ZlOiBmYWxzZSxcbiAgICAgIG9mZnNldFNlY3Rpb25zOiBmYWxzZSxcbiAgICAgIHJlc2V0U2xpZGVyczogZmFsc2UsXG4gICAgICBmYWRpbmdFZmZlY3Q6IGZhbHNlLFxuICAgICAgbm9ybWFsU2Nyb2xsRWxlbWVudHM6IG51bGwsXG4gICAgICBzY3JvbGxPdmVyZmxvdzogdHJ1ZSxcbiAgICAgIHNjcm9sbE92ZXJmbG93UmVzZXQ6IGZhbHNlLFxuICAgICAgdG91Y2hTZW5zaXRpdml0eTogNSxcbiAgICAgIHRvdWNoV3JhcHBlcjogbnVsbCxcbiAgICAgIGJpZ1NlY3Rpb25zRGVzdGluYXRpb246IG51bGwsXG4gICAgICAvL0FjY2Vzc2liaWxpdHlcbiAgICAgIGtleWJvYXJkU2Nyb2xsaW5nOiB0cnVlLFxuICAgICAgYW5pbWF0ZUFuY2hvcjogdHJ1ZSxcbiAgICAgIHJlY29yZEhpc3Rvcnk6IHRydWUsXG4gICAgICBhbGxvd0NvcnJlY3REaXJlY3Rpb246IGZhbHNlLFxuICAgICAgLy9kZXNpZ25cbiAgICAgIHNjcm9sbE92ZXJmbG93TWFjU3R5bGU6IHRydWUsXG4gICAgICBjb250cm9sQXJyb3dzOiB0cnVlLFxuICAgICAgY29udHJvbEFycm93c0hUTUw6IFsnPGRpdiBjbGFzcz1cIicgKyBTTElERVNfU1RZTEVEX0FSUk9XICsgJ1wiPjwvZGl2PicsICc8ZGl2IGNsYXNzPVwiJyArIFNMSURFU19TVFlMRURfQVJST1cgKyAnXCI+PC9kaXY+J10sXG4gICAgICBjb250cm9sQXJyb3dDb2xvcjogJyNmZmYnLFxuICAgICAgdmVydGljYWxDZW50ZXJlZDogdHJ1ZSxcbiAgICAgIHNlY3Rpb25zQ29sb3I6IFtdLFxuICAgICAgcGFkZGluZ1RvcDogMCxcbiAgICAgIHBhZGRpbmdCb3R0b206IDAsXG4gICAgICBmaXhlZEVsZW1lbnRzOiBudWxsLFxuICAgICAgcmVzcG9uc2l2ZTogMCxcbiAgICAgIC8vYmFja3dhcmRzIGNvbXBhYml0aWxpdHkgd2l0aCByZXNwb25zaXZlV2lkZHRoXG4gICAgICByZXNwb25zaXZlV2lkdGg6IDAsXG4gICAgICByZXNwb25zaXZlSGVpZ2h0OiAwLFxuICAgICAgcmVzcG9uc2l2ZVNsaWRlczogZmFsc2UsXG4gICAgICBwYXJhbGxheDogZmFsc2UsXG4gICAgICBwYXJhbGxheE9wdGlvbnM6IHtcbiAgICAgICAgdHlwZTogJ3JldmVhbCcsXG4gICAgICAgIHBlcmNlbnRhZ2U6IDYyLFxuICAgICAgICBwcm9wZXJ0eTogJ3RyYW5zbGF0ZSdcbiAgICAgIH0sXG4gICAgICBjYXJkczogZmFsc2UsXG4gICAgICBjYXJkc09wdGlvbnM6IHtcbiAgICAgICAgcGVyc3BlY3RpdmU6IDEwMCxcbiAgICAgICAgZmFkZUNvbnRlbnQ6IHRydWUsXG4gICAgICAgIGZhZGVCYWNrZ3JvdW5kOiB0cnVlXG4gICAgICB9LFxuICAgICAgLy9DdXN0b20gc2VsZWN0b3JzXG4gICAgICBzZWN0aW9uU2VsZWN0b3I6IFNFQ1RJT05fREVGQVVMVF9TRUwsXG4gICAgICBzbGlkZVNlbGVjdG9yOiBTTElERV9ERUZBVUxUX1NFTCxcbiAgICAgIC8vZXZlbnRzXG4gICAgICBhZnRlckxvYWQ6IG51bGwsXG4gICAgICBiZWZvcmVMZWF2ZTogbnVsbCxcbiAgICAgIG9uTGVhdmU6IG51bGwsXG4gICAgICBhZnRlclJlbmRlcjogbnVsbCxcbiAgICAgIGFmdGVyUmVzaXplOiBudWxsLFxuICAgICAgYWZ0ZXJSZUJ1aWxkOiBudWxsLFxuICAgICAgYWZ0ZXJTbGlkZUxvYWQ6IG51bGwsXG4gICAgICBvblNsaWRlTGVhdmU6IG51bGwsXG4gICAgICBhZnRlclJlc3BvbnNpdmU6IG51bGwsXG4gICAgICBvblNjcm9sbE92ZXJmbG93OiBudWxsLFxuICAgICAgbGF6eUxvYWRpbmc6IHRydWUsXG4gICAgICBvYnNlcnZlcjogdHJ1ZSxcbiAgICAgIHNjcm9sbEJleW9uZEZ1bGxwYWdlOiB0cnVlXG4gICAgfTtcblxuICAgIHZhciBjb250YWluZXIgPSBudWxsO1xuICAgIHZhciBnX2luaXRpYWxBbmNob3JzSW5Eb20gPSBmYWxzZTtcbiAgICB2YXIgb3JpZ2luYWxzID0gZGVlcEV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMpOyAvL2RlZXAgY29weVxuXG4gICAgdmFyIGdfb3B0aW9ucyA9IG51bGw7XG4gICAgZnVuY3Rpb24gZ2V0SW5pdGlhbEFuY2hvcnNJbkRvbSgpIHtcbiAgICAgIHJldHVybiBnX2luaXRpYWxBbmNob3JzSW5Eb207XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldENvbnRhaW5lcih2YWx1ZSkge1xuICAgICAgY29udGFpbmVyID0gdmFsdWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldENvbnRhaW5lcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0T3B0aW9ucygpIHtcbiAgICAgIHJldHVybiBnX29wdGlvbnMgfHwgZGVmYXVsdE9wdGlvbnM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuICAgICAgZ19vcHRpb25zID0gZGVlcEV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgb3JpZ2luYWxzID0gT2JqZWN0LmFzc2lnbih7fSwgZ19vcHRpb25zKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0T3JpZ2luYWxzKCkge1xuICAgICAgcmV0dXJuIG9yaWdpbmFscztcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0T3B0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICBkZWZhdWx0T3B0aW9uc1tuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKlxuICAgICogU2V0cyB0aGUgc3RhdGUgZm9yIGEgdmFyaWFibGUgd2l0aCBtdWx0aXBsZSBzdGF0ZXMgKG9yaWdpbmFsLCBhbmQgdGVtcG9yYWwpXG4gICAgKiBTb21lIHZhcmlhYmxlcyBzdWNoIGFzIGBhdXRvU2Nyb2xsaW5nYCBvciBgcmVjb3JkSGlzdG9yeWAgbWlnaHQgY2hhbmdlIGF1dG9tYXRpY2FsbHkgaXRzIHN0YXRlIHdoZW4gdXNpbmcgYHJlc3BvbnNpdmVgIG9yIGBhdXRvU2Nyb2xsaW5nOmZhbHNlYC5cbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGJvdGggc3RhdGVzLCB0aGUgb3JpZ2luYWwgYW5kIHRoZSB0ZW1wb3JhbCBvbmUuXG4gICAgKiBJZiB0eXBlIGlzIG5vdCAnaW50ZXJuYWwnLCB0aGVuIHdlIGFzc3VtZSB0aGUgdXNlciBpcyBnbG9iYWxseSBjaGFuZ2luZyB0aGUgdmFyaWFibGUuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHNldFZhcmlhYmxlU3RhdGUodmFyaWFibGUsIHZhbHVlLCB0eXBlKSB7XG4gICAgICBnX29wdGlvbnNbdmFyaWFibGVdID0gdmFsdWU7XG5cbiAgICAgIGlmICh0eXBlICE9PSAnaW50ZXJuYWwnKSB7XG4gICAgICAgIG9yaWdpbmFsc1t2YXJpYWJsZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgKiBTZXR0aW5nIG9wdGlvbnMgZnJvbSBET00gZWxlbWVudHMgaWYgdGhleSBhcmUgbm90IHByb3ZpZGVkLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBzZXRPcHRpb25zRnJvbURPTSgpIHtcbiAgICAgIC8vbm8gYW5jaG9ycyBvcHRpb24/IENoZWNraW5nIGZvciB0aGVtIGluIHRoZSBET00gYXR0cmlidXRlc1xuICAgICAgaWYgKCFnZXRPcHRpb25zKCkuYW5jaG9ycy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGFuY2hvcnNBdHRyaWJ1dGUgPSAnW2RhdGEtYW5jaG9yXSc7XG4gICAgICAgIHZhciBhbmNob3JzID0gJChnZXRPcHRpb25zKCkuc2VjdGlvblNlbGVjdG9yLnNwbGl0KCcsJykuam9pbihhbmNob3JzQXR0cmlidXRlICsgJywnKSArIGFuY2hvcnNBdHRyaWJ1dGUsIGNvbnRhaW5lcik7XG5cbiAgICAgICAgaWYgKGFuY2hvcnMubGVuZ3RoICYmIGFuY2hvcnMubGVuZ3RoID09PSAkKGdldE9wdGlvbnMoKS5zZWN0aW9uU2VsZWN0b3IsIGNvbnRhaW5lcikubGVuZ3RoKSB7XG4gICAgICAgICAgZ19pbml0aWFsQW5jaG9yc0luRG9tID0gdHJ1ZTtcbiAgICAgICAgICBhbmNob3JzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIGdldE9wdGlvbnMoKS5hbmNob3JzLnB1c2goZ2V0QXR0cihpdGVtLCAnZGF0YS1hbmNob3InKS50b1N0cmluZygpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSAvL25vIHRvb2x0aXBzIG9wdGlvbj8gQ2hlY2tpbmcgZm9yIHRoZW0gaW4gdGhlIERPTSBhdHRyaWJ1dGVzXG5cblxuICAgICAgaWYgKCFnZXRPcHRpb25zKCkubmF2aWdhdGlvblRvb2x0aXBzLmxlbmd0aCkge1xuICAgICAgICB2YXIgdG9vbHRpcHNBdHRyaWJ1dGUgPSAnW2RhdGEtdG9vbHRpcF0nO1xuICAgICAgICB2YXIgdG9vbHRpcHMgPSAkKGdldE9wdGlvbnMoKS5zZWN0aW9uU2VsZWN0b3Iuc3BsaXQoJywnKS5qb2luKHRvb2x0aXBzQXR0cmlidXRlICsgJywnKSArIHRvb2x0aXBzQXR0cmlidXRlLCBjb250YWluZXIpO1xuXG4gICAgICAgIGlmICh0b29sdGlwcy5sZW5ndGgpIHtcbiAgICAgICAgICB0b29sdGlwcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICBnZXRPcHRpb25zKCkubmF2aWdhdGlvblRvb2x0aXBzLnB1c2goZ2V0QXR0cihpdGVtLCAnZGF0YS10b29sdGlwJykudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcGxhaW5JdGVtID0gZnVuY3Rpb24gcGxhaW5JdGVtKHBhbmVsKSB7XG4gICAgICB0aGlzLmFuY2hvciA9IHBhbmVsLmFuY2hvcjtcbiAgICAgIHRoaXMuaXRlbSA9IHBhbmVsLml0ZW07XG4gICAgICB0aGlzLmluZGV4ID0gcGFuZWwuaW5kZXgoKTtcbiAgICAgIHRoaXMuaXNMYXN0ID0gdGhpcy5pbmRleCA9PT0gcGFuZWwuaXRlbS5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocGFuZWwuc2VsZWN0b3IpLmxlbmd0aCAtIDE7XG4gICAgICB0aGlzLmlzRmlyc3QgPSAhdGhpcy5pbmRleDtcbiAgICAgIHRoaXMuaXNBY3RpdmUgPSBwYW5lbC5pc0FjdGl2ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICogSXRlbS4gU2xpZGUgb3IgU2VjdGlvbiBvYmplY3RzIHNoYXJlIHRoZSBzYW1lIHByb3BlcnRpZXMuXG4gICAgKi9cblxuICAgIHZhciBJdGVtID0gZnVuY3Rpb24gSXRlbShlbCwgc2VsZWN0b3IpIHtcbiAgICAgIHRoaXMucGFyZW50ID0gdGhpcy5wYXJlbnQgfHwgbnVsbDtcbiAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgIHRoaXMuYW5jaG9yID0gZ2V0QXR0cihlbCwgJ2RhdGEtYW5jaG9yJykgfHwgZ2V0T3B0aW9ucygpLmFuY2hvcnNbaW5kZXgoZWwsIGdldE9wdGlvbnMoKS5zZWN0aW9uU2VsZWN0b3IpXTtcbiAgICAgIHRoaXMuaXRlbSA9IGVsO1xuICAgICAgdGhpcy5pc1Zpc2libGUgPSBpc1Zpc2libGUoZWwpO1xuICAgICAgdGhpcy5pc0FjdGl2ZSA9IGhhc0NsYXNzKGVsLCBBQ1RJVkUpO1xuICAgICAgdGhpcy5oYXNTY3JvbGwgPSBoYXNDbGFzcyhlbCwgT1ZFUkZMT1cpIHx8ICQoT1ZFUkZMT1dfU0VMLCBlbClbMF0gIT0gbnVsbDtcbiAgICAgIHRoaXMuaXNTZWN0aW9uID0gc2VsZWN0b3IgPT09IGdldE9wdGlvbnMoKS5zZWN0aW9uU2VsZWN0b3I7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IGNsb3Nlc3QoZWwsIFNMSURFU19DT05UQUlORVJfU0VMKSB8fCBjbG9zZXN0KGVsLCBXUkFQUEVSX1NFTCk7XG5cbiAgICAgIHRoaXMuaW5kZXggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpYmxpbmdzKCkuaW5kZXhPZih0aGlzKTtcbiAgICAgIH07XG4gICAgfTtcblxuICAgIEl0ZW0ucHJvdG90eXBlLnNpYmxpbmdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMuaXNTZWN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgICAgIHJldHVybiBzdGF0ZS5zZWN0aW9ucztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGUuc2VjdGlvbnNJbmNsdWRpbmdIaWRkZW47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQuc2xpZGVzIDogMDtcbiAgICB9O1xuXG4gICAgSXRlbS5wcm90b3R5cGUucHJldiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzaWJsaW5ncyA9IHRoaXMuc2libGluZ3MoKTtcbiAgICAgIHZhciBjdXJyZW50SW5kZXggPSB0aGlzLmlzU2VjdGlvbiA/IHNpYmxpbmdzLmluZGV4T2YodGhpcykgOiB0aGlzLnBhcmVudC5zbGlkZXMuaW5kZXhPZih0aGlzKTtcbiAgICAgIHZhciBwcmV2SW5kZXggPSBjdXJyZW50SW5kZXggLSAxO1xuXG4gICAgICBpZiAocHJldkluZGV4ID49IDApIHtcbiAgICAgICAgcmV0dXJuIHNpYmxpbmdzW3ByZXZJbmRleF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICBJdGVtLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHNpYmxpbmdzID0gdGhpcy5zaWJsaW5ncygpO1xuICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IHRoaXMuaXNTZWN0aW9uID8gc2libGluZ3MuaW5kZXhPZih0aGlzKSA6IHRoaXMucGFyZW50LnNsaWRlcy5pbmRleE9mKHRoaXMpO1xuICAgICAgdmFyIG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG5cbiAgICAgIGlmIChuZXh0SW5kZXggPCBzaWJsaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHNpYmxpbmdzW25leHRJbmRleF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICBJdGVtLnByb3RvdHlwZVtcInByZXZQYW5lbFwiXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByZXYoKSB8fCAodGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5wcmV2KCkgOiBudWxsKTtcbiAgICB9O1xuXG4gICAgSXRlbS5wcm90b3R5cGVbXCJuZXh0UGFuZWxcIl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZXh0KCkgfHwgKHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQubmV4dCgpIDogbnVsbCk7XG4gICAgfTtcblxuICAgIEl0ZW0ucHJvdG90eXBlLmdldFNpYmxpbmdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMuaXNTZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5zZWN0aW9ucztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0YXRlLnBhbmVscztcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZ2V0Tm9kZXMocGFuZWxzKSB7XG4gICAgICByZXR1cm4gcGFuZWxzLm1hcChmdW5jdGlvbiAocGFuZWwpIHtcbiAgICAgICAgcmV0dXJuIHBhbmVsLml0ZW07XG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0UGFuZWxCeUVsZW1lbnQocGFuZWxzLCBlbCkge1xuICAgICAgcmV0dXJuIHBhbmVscy5maW5kKGZ1bmN0aW9uIChwYW5lbCkge1xuICAgICAgICByZXR1cm4gcGFuZWwuaXRlbSA9PT0gZWw7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIFNlY3Rpb24gPSBmdW5jdGlvbiBTZWN0aW9uKGVsKSB7XG4gICAgICBwbGFpbkl0ZW0uY2FsbCh0aGlzLCBlbCk7XG4gICAgfTtcbiAgICB2YXIgU2xpZGUgPSBmdW5jdGlvbiBTbGlkZShlbCkge1xuICAgICAgcGxhaW5JdGVtLmNhbGwodGhpcywgZWwpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEdldHMgdGhlIGFjdGl2ZSBzbGlkZSAob3Igc2VjdGlvbikgZm9yIHRoZSBnaXZlbiBzZWN0aW9uXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGdldFNsaWRlT3JTZWN0aW9uKGRlc3RpbnkpIHtcbiAgICAgIHZhciBzbGlkZSA9ICQoU0xJREVfQUNUSVZFX1NFTCwgZGVzdGlueSk7XG5cbiAgICAgIGlmIChzbGlkZS5sZW5ndGgpIHtcbiAgICAgICAgZGVzdGlueSA9IHNsaWRlWzBdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVzdGlueTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U2xpZGVPclNlY3Rpb25QYW5lbChwYW5lbCkge1xuICAgICAgaWYgKCFwYW5lbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhbmVsLmFjdGl2ZVNsaWRlID8gcGFuZWwuYWN0aXZlU2xpZGUgOiBwYW5lbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNGdWxsUGFnZUFib3ZlKCkge1xuICAgICAgcmV0dXJuIGdldENvbnRhaW5lcigpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSA+PSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAqIEdldHMgdGhlIHNjcm9sbGluZyBzZXR0aW5ncyBkZXBlbmRpbmcgb24gdGhlIHBsdWdpbiBhdXRvU2Nyb2xsaW5nIG9wdGlvblxuICAgICovXG5cbiAgICBmdW5jdGlvbiBnZXRTY3JvbGxTZXR0aW5ncyh0b3ApIHtcbiAgICAgIHZhciBvcHRpb25zID0gZ2V0T3B0aW9ucygpO1xuICAgICAgdmFyIHBvc2l0aW9uO1xuICAgICAgdmFyIGVsZW1lbnQ7IC8vdG9wIHByb3BlcnR5IGFuaW1hdGlvblxuXG4gICAgICBpZiAob3B0aW9ucy5hdXRvU2Nyb2xsaW5nICYmICFvcHRpb25zLnNjcm9sbEJhcikge1xuICAgICAgICBwb3NpdGlvbiA9IC10b3A7XG4gICAgICAgIGVsZW1lbnQgPSAkKFdSQVBQRVJfU0VMKVswXTtcbiAgICAgIH0gLy93aW5kb3cgcmVhbCBzY3JvbGxpbmdcbiAgICAgIGVsc2Uge1xuICAgICAgICBwb3NpdGlvbiA9IHRvcDtcbiAgICAgICAgZWxlbWVudCA9IHdpbmRvdztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3B0aW9uczogcG9zaXRpb24sXG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnRcbiAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICogU2Nyb2xscyB0aGUgcGFnZSAvIHNsaWRlciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHBpeGVscy5cbiAgICAqIEl0IHdpbGwgZG8gaXQgb25lIG9yIGFub3RoZXIgd2F5IGRlcGVuZGlvbmcgb24gdGhlIGxpYnJhcnkncyBjb25maWcuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHNldFNjcm9sbGluZyhlbGVtZW50LCB2YWwpIHtcbiAgICAgIGlmICghZ2V0T3B0aW9ucygpLmF1dG9TY3JvbGxpbmcgfHwgZ2V0T3B0aW9ucygpLnNjcm9sbEJhciB8fCBlbGVtZW50LnNlbGYgIT0gd2luZG93ICYmIGhhc0NsYXNzKGVsZW1lbnQsIFNMSURFU19XUkFQUEVSKSkge1xuICAgICAgICAvL3Njcm9sbGluZyBob3Jpem9udGFsbHkgdGhyb3VnaCB0aGUgc2xpZGVzP1xuICAgICAgICBpZiAoZWxlbWVudC5zZWxmICE9IHdpbmRvdyAmJiBoYXNDbGFzcyhlbGVtZW50LCBTTElERVNfV1JBUFBFUikpIHtcbiAgICAgICAgICBlbGVtZW50LnNjcm9sbExlZnQgPSB2YWw7XG4gICAgICAgIH0gLy92ZXJ0aWNhbCBzY3JvbGxcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC5zY3JvbGxUbygwLCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCA9IHZhbCArICdweCc7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICogQWRkcyB0cmFuc2l0aW9uIGFuaW1hdGlvbnMgZm9yIHRoZSBnaXZlbiBlbGVtZW50XG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGFkZEFuaW1hdGlvbihlbGVtZW50KSB7XG4gICAgICB2YXIgdHJhbnNpdGlvbiA9ICd0cmFuc2Zvcm0gJyArIGdldE9wdGlvbnMoKS5zY3JvbGxpbmdTcGVlZCArICdtcyAnICsgZ2V0T3B0aW9ucygpLmVhc2luZ2NzczM7XG4gICAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBOT19UUkFOU0lUSU9OKTtcbiAgICAgIHJldHVybiBjc3MoZWxlbWVudCwge1xuICAgICAgICAnLXdlYmtpdC10cmFuc2l0aW9uJzogdHJhbnNpdGlvbixcbiAgICAgICAgJ3RyYW5zaXRpb24nOiB0cmFuc2l0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBSZXR1bnMgYHVwYCBvciBgZG93bmAgZGVwZW5kaW5nIG9uIHRoZSBzY3JvbGxpbmcgbW92ZW1lbnQgdG8gcmVhY2ggaXRzIGRlc3RpbmF0aW9uXG4gICAgKiBmcm9tIHRoZSBjdXJyZW50IHNlY3Rpb24uXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGdldFltb3ZlbWVudChhY3RpdmVTZWN0aW9uLCBkZXN0aW55KSB7XG4gICAgICB2YXIgZnJvbUluZGV4ID0gYWN0aXZlU2VjdGlvbi5pbmRleCgpO1xuICAgICAgdmFyIHRvSW5kZXggPSBpbmRleChkZXN0aW55LCBTRUNUSU9OX1NFTCk7XG5cbiAgICAgIGlmIChmcm9tSW5kZXggPT0gdG9JbmRleCkge1xuICAgICAgICByZXR1cm4gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnJvbUluZGV4ID4gdG9JbmRleCkge1xuICAgICAgICByZXR1cm4gJ3VwJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdkb3duJztcbiAgICB9XG4gICAgLyoqXG4gICAgKiBSZW1vdmUgdHJhbnNpdGlvbiBhbmltYXRpb25zIGZvciB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgICovXG5cbiAgICBmdW5jdGlvbiByZW1vdmVBbmltYXRpb24oZWxlbWVudCkge1xuICAgICAgcmV0dXJuIGFkZENsYXNzKGVsZW1lbnQsIE5PX1RSQU5TSVRJT04pO1xuICAgIH1cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIGNyb3NzLWJyb3dzZXIgdHJhbnNmb3JtIHN0cmluZy5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gZ2V0VHJhbnNmb3Jtcyh0cmFuc2xhdGUzZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJy13ZWJraXQtdHJhbnNmb3JtJzogdHJhbnNsYXRlM2QsXG4gICAgICAgICctbW96LXRyYW5zZm9ybSc6IHRyYW5zbGF0ZTNkLFxuICAgICAgICAnLW1zLXRyYW5zZm9ybSc6IHRyYW5zbGF0ZTNkLFxuICAgICAgICAndHJhbnNmb3JtJzogdHJhbnNsYXRlM2RcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHNpbGVudFNjcm9sbElkO1xuICAgIC8qKlxuICAgICogQWRkcyBhIGNzczMgdHJhbnNmb3JtIHByb3BlcnR5IHRvIHRoZSBjb250YWluZXIgY2xhc3Mgd2l0aCBvciB3aXRob3V0IGFuaW1hdGlvbiBkZXBlbmRpbmcgb24gdGhlIGFuaW1hdGVkIHBhcmFtLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1Db250YWluZXIodHJhbnNsYXRlM2QsIGFuaW1hdGVkKSB7XG4gICAgICBpZiAoYW5pbWF0ZWQpIHtcbiAgICAgICAgYWRkQW5pbWF0aW9uKGdldENvbnRhaW5lcigpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZUFuaW1hdGlvbihnZXRDb250YWluZXIoKSk7XG4gICAgICB9XG5cbiAgICAgIGNsZWFyVGltZW91dChzaWxlbnRTY3JvbGxJZCk7XG4gICAgICBjc3MoZ2V0Q29udGFpbmVyKCksIGdldFRyYW5zZm9ybXModHJhbnNsYXRlM2QpKTtcbiAgICAgIEZQLnRlc3QudHJhbnNsYXRlM2QgPSB0cmFuc2xhdGUzZDsgLy9zeW5jcm9ub3VzbHkgcmVtb3ZpbmcgdGhlIGNsYXNzIGFmdGVyIHRoZSBhbmltYXRpb24gaGFzIGJlZW4gYXBwbGllZC5cblxuICAgICAgc2lsZW50U2Nyb2xsSWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoZ2V0Q29udGFpbmVyKCksIE5PX1RSQU5TSVRJT04pO1xuICAgICAgfSwgMTApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogU2Nyb2xscyBzaWxlbnRseSAod2l0aCBubyBhbmltYXRpb24pIHRoZSBwYWdlIHRvIHRoZSBnaXZlbiBZIHBvc2l0aW9uLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBzaWxlbnRTY3JvbGwodG9wKSB7XG4gICAgICAvLyBUaGUgZmlyc3Qgc2VjdGlvbiBjYW4gaGF2ZSBhIG5lZ2F0aXZlIHZhbHVlIGluIGlPUyAxMC4gTm90IHF1aXRlIHN1cmUgd2h5OiAtMC4wMTQyODIyMjY1NjI1XG4gICAgICAvLyB0aGF0J3Mgd2h5IHdlIHJvdW5kIGl0IHRvIDAuXG4gICAgICB2YXIgcm91bmRlZFRvcCA9IE1hdGgucm91bmQodG9wKTtcblxuICAgICAgaWYgKGdldE9wdGlvbnMoKS5jc3MzICYmIGdldE9wdGlvbnMoKS5hdXRvU2Nyb2xsaW5nICYmICFnZXRPcHRpb25zKCkuc2Nyb2xsQmFyKSB7XG4gICAgICAgIHZhciB0cmFuc2xhdGUzZCA9ICd0cmFuc2xhdGUzZCgwcHgsIC0nICsgcm91bmRlZFRvcCArICdweCwgMHB4KSc7XG4gICAgICAgIHRyYW5zZm9ybUNvbnRhaW5lcih0cmFuc2xhdGUzZCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIGlmIChnZXRPcHRpb25zKCkuYXV0b1Njcm9sbGluZyAmJiAhZ2V0T3B0aW9ucygpLnNjcm9sbEJhcikge1xuICAgICAgICBjc3MoZ2V0Q29udGFpbmVyKCksIHtcbiAgICAgICAgICAndG9wJzogLXJvdW5kZWRUb3AgKyAncHgnXG4gICAgICAgIH0pO1xuICAgICAgICBGUC50ZXN0LnRvcCA9IC1yb3VuZGVkVG9wICsgJ3B4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBzY3JvbGxTZXR0aW5ncyA9IGdldFNjcm9sbFNldHRpbmdzKHJvdW5kZWRUb3ApO1xuICAgICAgICBzZXRTY3JvbGxpbmcoc2Nyb2xsU2V0dGluZ3MuZWxlbWVudCwgc2Nyb2xsU2V0dGluZ3Mub3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgRlAuc2V0U2Nyb2xsaW5nU3BlZWQgPSBzZXRTY3JvbGxpbmdTcGVlZDtcbiAgICAvKipcbiAgICAqIERlZmluZXMgdGhlIHNjcm9sbGluZyBzcGVlZFxuICAgICovXG5cbiAgICBmdW5jdGlvbiBzZXRTY3JvbGxpbmdTcGVlZCh2YWx1ZSwgdHlwZSkge1xuICAgICAgc2V0VmFyaWFibGVTdGF0ZSgnc2Nyb2xsaW5nU3BlZWQnLCB2YWx1ZSwgdHlwZSk7XG4gICAgfVxuXG4gICAgdmFyICRib2R5ID0gbnVsbDtcbiAgICB2YXIgJGh0bWwgPSBudWxsO1xuICAgIHZhciAkaHRtbEJvZHkgPSBudWxsOyAvLyBjYWNoaW5nIGNvbW1vbiBlbGVtZW50c1xuXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGUoKSB7XG4gICAgICAkYm9keSA9ICQoJ2JvZHknKVswXTtcbiAgICAgICRodG1sID0gJCgnaHRtbCcpWzBdO1xuICAgICAgJGh0bWxCb2R5ID0gJCgnaHRtbCwgYm9keScpO1xuICAgIH1cblxuICAgIC8vQHRzLWNoZWNrXG5cbiAgICB2YXIgX2dfYW5pbWF0ZVNjcm9sbDtcbiAgICAvKipcbiAgICAqIFNpbXVsYXRlcyB0aGUgYW5pbWF0ZWQgc2Nyb2xsVG9wIG9mIGpRdWVyeS4gVXNlZCB3aGVuIGNzczM6ZmFsc2Ugb3Igc2Nyb2xsQmFyOnRydWUgb3IgYXV0b1Njcm9sbGluZzpmYWxzZVxuICAgICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTYxMzY3ODkvMTA4MTM5NlxuICAgICovXG5cblxuICAgIGZ1bmN0aW9uIHNjcm9sbFRvKGVsZW1lbnQsIHRvLCBkdXJhdGlvbiwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBzdGFydCA9IGdldFNjcm9sbGVkUG9zaXRpb24oZWxlbWVudCk7XG4gICAgICB2YXIgY2hhbmdlID0gdG8gLSBzdGFydDtcbiAgICAgIHZhciBpc0NhbGxiYWNrRmlyZWQgPSBmYWxzZTtcbiAgICAgIHZhciBzdGFydFRpbWU7XG4gICAgICB2YXIgd2FzQW5pbWF0aW9uQWN0aXZlID0gc3RhdGUuYWN0aXZlQW5pbWF0aW9uO1xuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICBhY3RpdmVBbmltYXRpb246IHRydWVcbiAgICAgIH0pOyAvLyBDYW5jZWxsaW5nIGFueSBwb3NzaWJsZSBwcmV2aW91cyBhbmltYXRpb25zIChpbzogY2xpY2tpbmcgb24gbmF2IGRvdHMgdmVyeSBmYXN0KVxuXG4gICAgICBpZiAoX2dfYW5pbWF0ZVNjcm9sbCkge1xuICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoX2dfYW5pbWF0ZVNjcm9sbCk7XG4gICAgICB9XG5cbiAgICAgIF9nX2FuaW1hdGVTY3JvbGwgPSBmdW5jdGlvbiBnX2FuaW1hdGVTY3JvbGwodGltZXN0YW1wKSB7XG4gICAgICAgIGlmICghc3RhcnRUaW1lKSB7XG4gICAgICAgICAgc3RhcnRUaW1lID0gdGltZXN0YW1wO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gTWF0aC5mbG9vcih0aW1lc3RhbXAgLSBzdGFydFRpbWUpO1xuXG4gICAgICAgIGlmIChzdGF0ZS5hY3RpdmVBbmltYXRpb24pIHtcbiAgICAgICAgICAvL2luIG9yZGVyIHRvIHN0b3BlIGl0IGZyb20gb3RoZXIgZnVuY3Rpb24gd2hlbmV2ZXIgd2Ugd2FudFxuICAgICAgICAgIHZhciB2YWwgPSB0bztcblxuICAgICAgICAgIGlmIChkdXJhdGlvbikge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdmFsID0gd2luLmZwX2Vhc2luZ3NbZ2V0T3B0aW9ucygpLmVhc2luZ10oY3VycmVudFRpbWUsIHN0YXJ0LCBjaGFuZ2UsIGR1cmF0aW9uKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY3VycmVudFRpbWUgPD0gZHVyYXRpb24pIHtcbiAgICAgICAgICAgIHNldFNjcm9sbGluZyhlbGVtZW50LCB2YWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjdXJyZW50VGltZSA8IGR1cmF0aW9uKSB7XG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKF9nX2FuaW1hdGVTY3JvbGwpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAndW5kZWZpbmVkJyAmJiAhaXNDYWxsYmFja0ZpcmVkKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBhY3RpdmVBbmltYXRpb246IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlzQ2FsbGJhY2tGaXJlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFpc0NhbGxiYWNrRmlyZWQgJiYgIXdhc0FuaW1hdGlvbkFjdGl2ZSkge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlQW5pbWF0aW9uOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlzQ2FsbGJhY2tGaXJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX2dfYW5pbWF0ZVNjcm9sbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICogR2V0dGluZyB0aGUgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgdG8gc2Nyb2xsIHdoZW4gdXNpbmcgalF1ZXJ5IGFuaW1hdGlvbnNcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gZ2V0U2Nyb2xsZWRQb3NpdGlvbihlbGVtZW50KSB7XG4gICAgICB2YXIgcG9zaXRpb247IC8vaXMgbm90IHRoZSB3aW5kb3cgZWxlbWVudCBhbmQgaXMgYSBzbGlkZT9cblxuICAgICAgaWYgKGVsZW1lbnQuc2VsZiAhPSB3aW4gJiYgaGFzQ2xhc3MoZWxlbWVudCwgU0xJREVTX1dSQVBQRVIpKSB7XG4gICAgICAgIHBvc2l0aW9uID0gZWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgfSBlbHNlIGlmICghZ2V0T3B0aW9ucygpLmF1dG9TY3JvbGxpbmcgfHwgZ2V0T3B0aW9ucygpLnNjcm9sbEJhcikge1xuICAgICAgICBwb3NpdGlvbiA9IGdldFNjcm9sbFRvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9zaXRpb24gPSBlbGVtZW50Lm9mZnNldFRvcDtcbiAgICAgIH0gLy9nZXRzIHRoZSB0b3AgcHJvcGVydHkgb2YgdGhlIHdyYXBwZXJcblxuXG4gICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBNYWtlcyBzdXJlIHRvIG9ubHkgY3JlYXRlIGEgUGFuZWwgb2JqZWN0IGlmIHRoZSBlbGVtZW50IGV4aXN0XG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIG51bGxPclNlY3Rpb24oZWwpIHtcbiAgICAgIGlmIChlbCAmJiAhZWwuaXRlbSkge1xuICAgICAgICByZXR1cm4gbmV3IFNlY3Rpb24obmV3IFNlY3Rpb25QYW5lbChlbCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWwgPyBuZXcgU2VjdGlvbihlbCkgOiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG51bGxPclNsaWRlKGVsKSB7XG4gICAgICByZXR1cm4gZWwgPyBuZXcgU2xpZGUoZWwpIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIERpc3BhdGNoIGV2ZW50cyAmIGNhbGxiYWNrc1xuICAgICovXG5cbiAgICBmdW5jdGlvbiBmaXJlQ2FsbGJhY2soZXZlbnROYW1lLCB2KSB7XG4gICAgICB2YXIgZXZlbnREYXRhID0gZ2V0RXZlbnREYXRhKGV2ZW50TmFtZSwgdik7XG4gICAgICB0cmlnZ2VyKGdldENvbnRhaW5lcigpLCBldmVudE5hbWUsIGV2ZW50RGF0YSk7XG5cbiAgICAgIGlmIChnZXRPcHRpb25zKClbZXZlbnROYW1lXS5hcHBseShldmVudERhdGFbT2JqZWN0LmtleXMoZXZlbnREYXRhKVswXV0sIHRvQXJyYXkoZXZlbnREYXRhKSkgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICogR2V0cyB0aGUgZXZlbnQncyBkYXRhIGZvciB0aGUgZ2l2ZW4gZXZlbnQgb24gdGhlIHJpZ2h0IGZvcm1hdC5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gZ2V0RXZlbnREYXRhKGV2ZW50TmFtZSwgdikge1xuICAgICAgLy91c2luZyBmdW5jdGlvbnMgdG8gcnVuIG9ubHkgdGhlIG5lY2Vzc2FyeSBiaXRzIHdpdGhpbiB0aGUgb2JqZWN0XG4gICAgICB2YXIgcGFyYW1zUGVyRXZlbnQgPSB7XG4gICAgICAgIGFmdGVyUmVuZGVyOiBmdW5jdGlvbiBhZnRlclJlbmRlcigpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2VjdGlvbjogbnVsbE9yU2VjdGlvbihnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb24pLFxuICAgICAgICAgICAgc2xpZGU6IG51bGxPclNsaWRlKGdldFN0YXRlKCkuYWN0aXZlU2VjdGlvbi5hY3RpdmVTbGlkZSlcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvbkxlYXZlOiBmdW5jdGlvbiBvbkxlYXZlKCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcmlnaW46IG51bGxPclNlY3Rpb24odi5pdGVtcy5vcmlnaW4pLFxuICAgICAgICAgICAgZGVzdGluYXRpb246IG51bGxPclNlY3Rpb24odi5pdGVtcy5kZXN0aW5hdGlvbiksXG4gICAgICAgICAgICBkaXJlY3Rpb246IHYuZGlyZWN0aW9uLFxuICAgICAgICAgICAgdHJpZ2dlcjogZ2V0U3RhdGUoKS5zY3JvbGxUcmlnZ2VyXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgYWZ0ZXJMb2FkOiBmdW5jdGlvbiBhZnRlckxvYWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcmFtc1BlckV2ZW50Lm9uTGVhdmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWZ0ZXJTbGlkZUxvYWQ6IGZ1bmN0aW9uIGFmdGVyU2xpZGVMb2FkKCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZWN0aW9uOiBudWxsT3JTZWN0aW9uKHYuaXRlbXMuc2VjdGlvbiksXG4gICAgICAgICAgICBvcmlnaW46IG51bGxPclNlY3Rpb24odi5pdGVtcy5vcmlnaW4pLFxuICAgICAgICAgICAgZGVzdGluYXRpb246IG51bGxPclNlY3Rpb24odi5pdGVtcy5kZXN0aW5hdGlvbiksXG4gICAgICAgICAgICBkaXJlY3Rpb246IHYuZGlyZWN0aW9uLFxuICAgICAgICAgICAgdHJpZ2dlcjogZ2V0U3RhdGUoKS5zY3JvbGxUcmlnZ2VyXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TbGlkZUxlYXZlOiBmdW5jdGlvbiBvblNsaWRlTGVhdmUoKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcmFtc1BlckV2ZW50LmFmdGVyU2xpZGVMb2FkKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGJlZm9yZUxlYXZlOiBmdW5jdGlvbiBiZWZvcmVMZWF2ZSgpIHtcbiAgICAgICAgICByZXR1cm4gcGFyYW1zUGVyRXZlbnQub25MZWF2ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBvblNjcm9sbE92ZXJmbG93OiBmdW5jdGlvbiBvblNjcm9sbE92ZXJmbG93KCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZWN0aW9uOiBudWxsT3JTZWN0aW9uKGdldFN0YXRlKCkuYWN0aXZlU2VjdGlvbiksXG4gICAgICAgICAgICBzbGlkZTogbnVsbE9yU2xpZGUoZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uLmFjdGl2ZVNsaWRlKSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB2LnBvc2l0aW9uLFxuICAgICAgICAgICAgZGlyZWN0aW9uOiB2LmRpcmVjdGlvblxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gcGFyYW1zUGVyRXZlbnRbZXZlbnROYW1lXSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogUGxheXMgdmlkZW8gYW5kIGF1ZGlvIGVsZW1lbnRzLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBwbGF5TWVkaWEoZGVzdGlueSkge1xuICAgICAgdmFyIHBhbmVsID0gZ2V0U2xpZGVPclNlY3Rpb24oZGVzdGlueSk7IC8vcGxheWluZyBIVE1MNSBtZWRpYSBlbGVtZW50c1xuXG4gICAgICAkKCd2aWRlbywgYXVkaW8nLCBwYW5lbCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2RhdGEtYXV0b3BsYXknKSAmJiB0eXBlb2YgZWxlbWVudC5wbGF5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZWxlbWVudC5wbGF5KCk7XG4gICAgICAgIH1cbiAgICAgIH0pOyAvL3lvdXR1YmUgdmlkZW9zXG5cbiAgICAgICQoJ2lmcmFtZVtzcmMqPVwieW91dHViZS5jb20vZW1iZWQvXCJdJywgcGFuZWwpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkYXRhLWF1dG9wbGF5JykpIHtcbiAgICAgICAgICBwbGF5WW91dHViZShlbGVtZW50KTtcbiAgICAgICAgfSAvL2luIGNhc2UgdGhlIFVSTCB3YXMgbm90IGxvYWRlZCB5ZXQuIE9uIHBhZ2UgbG9hZCB3ZSBuZWVkIHRpbWUgZm9yIHRoZSBuZXcgVVJMICh3aXRoIHRoZSBBUEkgc3RyaW5nKSB0byBsb2FkLlxuXG5cbiAgICAgICAgZWxlbWVudC5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkYXRhLWF1dG9wbGF5JykpIHtcbiAgICAgICAgICAgIHBsYXlZb3V0dWJlKGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAqIFBsYXlzIGEgeW91dHViZSB2aWRlb1xuICAgICovXG5cbiAgICBmdW5jdGlvbiBwbGF5WW91dHViZShlbGVtZW50KSB7XG4gICAgICBlbGVtZW50LmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoJ3tcImV2ZW50XCI6XCJjb21tYW5kXCIsXCJmdW5jXCI6XCJwbGF5VmlkZW9cIixcImFyZ3NcIjpcIlwifScsICcqJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICogU3RvcHMgdmlkZW8gYW5kIGF1ZGlvIGVsZW1lbnRzLlxuICAgICovXG5cblxuICAgIGZ1bmN0aW9uIHN0b3BNZWRpYShkZXN0aW55KSB7XG4gICAgICB2YXIgcGFuZWwgPSBnZXRTbGlkZU9yU2VjdGlvbihkZXN0aW55KTsgLy9zdG9wcGluZyBIVE1MNSBtZWRpYSBlbGVtZW50c1xuXG4gICAgICAkKCd2aWRlbywgYXVkaW8nLCBwYW5lbCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdkYXRhLWtlZXBwbGF5aW5nJykgJiYgdHlwZW9mIGVsZW1lbnQucGF1c2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlbGVtZW50LnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pOyAvL3lvdXR1YmUgdmlkZW9zXG5cbiAgICAgICQoJ2lmcmFtZVtzcmMqPVwieW91dHViZS5jb20vZW1iZWQvXCJdJywgcGFuZWwpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKC95b3V0dWJlXFwuY29tXFwvZW1iZWRcXC8vLnRlc3QoZ2V0QXR0cihlbGVtZW50LCAnc3JjJykpICYmICFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGF0YS1rZWVwcGxheWluZycpKSB7XG4gICAgICAgICAgZWxlbWVudC5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCd7XCJldmVudFwiOlwiY29tbWFuZFwiLFwiZnVuY1wiOlwicGF1c2VWaWRlb1wiLFwiYXJnc1wiOlwiXCJ9JywgJyonKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIC8qXG4gICAgKiBFbmFibGVzIHRoZSBZb3V0dWJlIHZpZGVvcyBBUEkgc28gd2UgY2FuIGNvbnRyb2wgdGhlaXIgZmxvdyBpZiBuZWNlc3NhcnkuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGVuYWJsZVlvdXR1YmVBUEkoKSB7XG4gICAgICAkKCdpZnJhbWVbc3JjKj1cInlvdXR1YmUuY29tL2VtYmVkL1wiXScsIGdldENvbnRhaW5lcigpKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGFkZFVSTFBhcmFtKGl0ZW0sICdlbmFibGVqc2FwaT0xJyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBBZGRzIGEgbmV3IHBhcmFtZXRlciBhbmQgaXRzIHZhbHVlIHRvIHRoZSBgc3JjYCBvZiBhIGdpdmVuIGVsZW1lbnRcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gYWRkVVJMUGFyYW0oZWxlbWVudCwgbmV3UGFyYW0pIHtcbiAgICAgIHZhciBvcmlnaW5hbFNyYyA9IGdldEF0dHIoZWxlbWVudCwgJ3NyYycpO1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3NyYycsIG9yaWdpbmFsU3JjICsgZ2V0VXJsUGFyYW1TaWduKG9yaWdpbmFsU3JjKSArIG5ld1BhcmFtKTtcbiAgICB9XG4gICAgLypcbiAgICAqIFJldHVybnMgdGhlIHByZWZpeCBzaWduIHRvIHVzZSBmb3IgYSBuZXcgcGFyYW1ldGVyIGluIGFuIGV4aXN0ZW4gVVJMLlxuICAgICpcbiAgICAqIEByZXR1cm4ge1N0cmluZ30gID8gfCAmXG4gICAgKi9cblxuXG4gICAgZnVuY3Rpb24gZ2V0VXJsUGFyYW1TaWduKHVybCkge1xuICAgICAgcmV0dXJuICEvXFw/Ly50ZXN0KHVybCkgPyAnPycgOiAnJic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBMYXp5IGxvYWRzIGltYWdlLCB2aWRlbyBhbmQgYXVkaW8gZWxlbWVudHMuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGxhenlMb2FkKGRlc3RpbnkpIHtcbiAgICAgIGlmICghZ2V0T3B0aW9ucygpLmxhenlMb2FkaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHBhbmVsID0gZ2V0U2xpZGVPclNlY3Rpb24oZGVzdGlueSk7XG4gICAgICAkKCdpbWdbZGF0YS1zcmNdLCBpbWdbZGF0YS1zcmNzZXRdLCBzb3VyY2VbZGF0YS1zcmNdLCBzb3VyY2VbZGF0YS1zcmNzZXRdLCB2aWRlb1tkYXRhLXNyY10sIGF1ZGlvW2RhdGEtc3JjXSwgaWZyYW1lW2RhdGEtc3JjXScsIHBhbmVsKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIFsnc3JjJywgJ3NyY3NldCddLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgICB2YXIgYXR0cmlidXRlID0gZ2V0QXR0cihlbGVtZW50LCAnZGF0YS0nICsgdHlwZSk7XG5cbiAgICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwgJiYgYXR0cmlidXRlKSB7XG4gICAgICAgICAgICBzZXRTcmMoZWxlbWVudCwgdHlwZSk7XG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChtYXRjaGVzKGVsZW1lbnQsICdzb3VyY2UnKSkge1xuICAgICAgICAgIHZhciBlbGVtZW50VG9QbGF5ID0gY2xvc2VzdChlbGVtZW50LCAndmlkZW8sIGF1ZGlvJyk7XG5cbiAgICAgICAgICBpZiAoZWxlbWVudFRvUGxheSkge1xuICAgICAgICAgICAgZWxlbWVudFRvUGxheS5sb2FkKCk7XG5cbiAgICAgICAgICAgIGVsZW1lbnRUb1BsYXkub25sb2FkZWRkYXRhID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogU2V0cyBhIGNsYXNzIGZvciB0aGUgYm9keSBvZiB0aGUgcGFnZSBkZXBlbmRpbmcgb24gdGhlIGFjdGl2ZSBzZWN0aW9uIC8gc2xpZGVcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gc2V0Qm9keUNsYXNzKCkge1xuICAgICAgdmFyIHNlY3Rpb24gPSBnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb24uaXRlbTtcbiAgICAgIHZhciBzbGlkZSA9IGdldFN0YXRlKCkuYWN0aXZlU2VjdGlvbi5hY3RpdmVTbGlkZTtcbiAgICAgIHZhciBzZWN0aW9uQW5jaG9yID0gZ2V0QW5jaG9yKHNlY3Rpb24pO1xuICAgICAgdmFyIHRleHQgPSBTdHJpbmcoc2VjdGlvbkFuY2hvcik7XG5cbiAgICAgIGlmIChzbGlkZSkge1xuICAgICAgICB2YXIgc2xpZGVBbmNob3IgPSBnZXRBbmNob3Ioc2xpZGUuaXRlbSk7XG4gICAgICAgIHRleHQgPSB0ZXh0ICsgJy0nICsgc2xpZGVBbmNob3I7XG4gICAgICB9IC8vY2hhbmdpbmcgc2xhc2ggZm9yIGRhc2ggdG8gbWFrZSBpdCBhIHZhbGlkIENTUyBzdHlsZVxuXG5cbiAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoJy8nLCAnLScpLnJlcGxhY2UoJyMnLCAnJyk7IC8vcmVtb3ZpbmcgcHJldmlvdXMgYW5jaG9yIGNsYXNzZXNcblxuICAgICAgdmFyIGNsYXNzUmUgPSBuZXcgUmVnRXhwKCdcXFxcYlxcXFxzPycgKyBWSUVXSU5HX1BSRUZJWCArICctW15cXFxcc10rXFxcXGInLCBcImdcIik7XG4gICAgICAkYm9keS5jbGFzc05hbWUgPSAkYm9keS5jbGFzc05hbWUucmVwbGFjZShjbGFzc1JlLCAnJyk7IC8vYWRkaW5nIHRoZSBjdXJyZW50IGFuY2hvclxuXG4gICAgICBhZGRDbGFzcygkYm9keSwgVklFV0lOR19QUkVGSVggKyAnLScgKyB0ZXh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBHZXRzIHRoZSBhbmNob3IgZm9yIHRoZSBnaXZlbiBzbGlkZSAvIHNlY3Rpb24uIEl0cyBpbmRleCB3aWxsIGJlIHVzZWQgaWYgdGhlcmUncyBub25lLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBnZXRBbmNob3IoZWxlbWVudCkge1xuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgYW5jaG9yID0gZ2V0QXR0cihlbGVtZW50LCAnZGF0YS1hbmNob3InKTtcbiAgICAgIHZhciBlbGVtZW50SW5kZXggPSBpbmRleChlbGVtZW50KTsgLy9TbGlkZSB3aXRob3V0IGFuY2hvciBsaW5rPyBXZSB0YWtlIHRoZSBpbmRleCBpbnN0ZWFkLlxuXG4gICAgICBpZiAoYW5jaG9yID09IG51bGwpIHtcbiAgICAgICAgYW5jaG9yID0gZWxlbWVudEluZGV4O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYW5jaG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIHdlYnNpdGUgZGVwZW5kaW5nIG9uIHRoZSBhY3RpdmUgc2VjdGlvbi9zbGlkZS5cbiAgICAqIEl0IGNoYW5nZXMgdGhlIFVSTCBoYXNoIHdoZW4gbmVlZGVkIGFuZCB1cGRhdGVzIHRoZSBib2R5IGNsYXNzLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBzZXRQYWdlU3RhdHVzKHNsaWRlSW5kZXgsIHNsaWRlQW5jaG9yLCBhbmNob3JMaW5rKSB7XG4gICAgICB2YXIgc2VjdGlvbkhhc2ggPSAnJztcblxuICAgICAgaWYgKGdldE9wdGlvbnMoKS5hbmNob3JzLmxlbmd0aCAmJiAhZ2V0T3B0aW9ucygpLmxvY2tBbmNob3JzKSB7XG4gICAgICAgIC8vaXNuJ3QgaXQgdGhlIGZpcnN0IHNsaWRlP1xuICAgICAgICBpZiAoc2xpZGVJbmRleCkge1xuICAgICAgICAgIGlmIChhbmNob3JMaW5rICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNlY3Rpb25IYXNoID0gYW5jaG9yTGluaztcbiAgICAgICAgICB9IC8vc2xpZGUgd2l0aG91dCBhbmNob3IgbGluaz8gV2UgdGFrZSB0aGUgaW5kZXggaW5zdGVhZC5cblxuXG4gICAgICAgICAgaWYgKHNsaWRlQW5jaG9yID09IG51bGwpIHtcbiAgICAgICAgICAgIHNsaWRlQW5jaG9yID0gc2xpZGVJbmRleDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICBsYXN0U2Nyb2xsZWRTbGlkZTogc2xpZGVBbmNob3JcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZXRVcmxIYXNoKHNlY3Rpb25IYXNoICsgJy8nICsgc2xpZGVBbmNob3IpOyAvL2ZpcnN0IHNsaWRlIHdvbid0IGhhdmUgc2xpZGUgYW5jaG9yLCBqdXN0IHRoZSBzZWN0aW9uIG9uZVxuICAgICAgICB9IGVsc2UgaWYgKHNsaWRlSW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgIGxhc3RTY3JvbGxlZFNsaWRlOiBzbGlkZUFuY2hvclxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNldFVybEhhc2goYW5jaG9yTGluayk7XG4gICAgICAgIH0gLy9zZWN0aW9uIHdpdGhvdXQgc2xpZGVzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNldFVybEhhc2goYW5jaG9yTGluayk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0Qm9keUNsYXNzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICogU2V0cyB0aGUgVVJMIGhhc2guXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHNldFVybEhhc2godXJsKSB7XG4gICAgICBpZiAoZ2V0T3B0aW9ucygpLnJlY29yZEhpc3RvcnkpIHtcbiAgICAgICAgbG9jYXRpb24uaGFzaCA9IHVybDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vTW9iaWxlIENocm9tZSBkb2Vzbid0IHdvcmsgdGhlIG5vcm1hbCB3YXksIHNvLi4uIGxldHMgdXNlIEhUTUw1IGZvciBwaG9uZXMgOilcbiAgICAgICAgaWYgKGlzVG91Y2hEZXZpY2UgfHwgaXNUb3VjaCkge1xuICAgICAgICAgIHdpbi5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgJyMnICsgdXJsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYmFzZVVybCA9IHdpbi5sb2NhdGlvbi5ocmVmLnNwbGl0KCcjJylbMF07XG4gICAgICAgICAgd2luLmxvY2F0aW9uLnJlcGxhY2UoYmFzZVVybCArICcjJyArIHVybCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEdldHMgdGhlIG5hbWUgZm9yIHNjcmVlbiByZWFkZXJzIGZvciBhIHNlY3Rpb24vc2xpZGUgbmF2aWdhdGlvbiBidWxsZXQuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGdldEJ1bGxldExpbmtOYW1lKGksIGRlZmF1bHROYW1lLCBpdGVtKSB7XG4gICAgICB2YXIgYW5jaG9yID0gZGVmYXVsdE5hbWUgPT09ICdTZWN0aW9uJyA/IGdldE9wdGlvbnMoKS5hbmNob3JzW2ldIDogZ2V0QXR0cihpdGVtLCAnZGF0YS1hbmNob3InKTtcbiAgICAgIHJldHVybiBlbmNvZGVVUkkoZ2V0T3B0aW9ucygpLm5hdmlnYXRpb25Ub29sdGlwc1tpXSB8fCBhbmNob3IgfHwgZGVmYXVsdE5hbWUgKyAnICcgKyAoaSArIDEpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzbGlkZUJ1bGxldEhhbmRsZXIoZSkge1xuICAgICAgLy8gbm90IGFsbCBldmVudHMgYXJlIGNhbmNlbGxhYmxlIFxuICAgICAgLy8gaHR0cHM6Ly93d3cudXJpcG9ydHMuY29tL2Jsb2cvZWFzeS1maXgtZm9yLWludGVydmVudGlvbi1pZ25vcmVkLWF0dGVtcHQtdG8tY2FuY2VsLWEtdG91Y2htb3ZlLWV2ZW50LXdpdGgtY2FuY2VsYWJsZS1mYWxzZS9cbiAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgcHJldmVudERlZmF1bHQoZSk7XG4gICAgICB9XG5cbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsVHJpZ2dlcjogJ2hvcml6b250YWxOYXYnXG4gICAgICB9KTtcbiAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG5cbiAgICAgIHZhciBzZWN0aW9uRWxlbSA9IGNsb3Nlc3QodGhpcywgU0VDVElPTl9TRUwpO1xuICAgICAgdmFyIHNsaWRlcyA9ICQoU0xJREVTX1dSQVBQRVJfU0VMLCBjbG9zZXN0KHRoaXMsIFNFQ1RJT05fU0VMKSlbMF07XG4gICAgICB2YXIgc2VjdGlvbiA9IGdldFBhbmVsQnlFbGVtZW50KGdldFN0YXRlKCkuc2VjdGlvbnMsIHNlY3Rpb25FbGVtKTtcbiAgICAgIHZhciBkZXN0aW55ID0gc2VjdGlvbi5zbGlkZXNbaW5kZXgoY2xvc2VzdCh0aGlzLCAnbGknKSldO1xuICAgICAgRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRzLmxhbmRzY2FwZVNjcm9sbCwge1xuICAgICAgICBzbGlkZXM6IHNsaWRlcyxcbiAgICAgICAgZGVzdGluYXRpb246IGRlc3RpbnkuaXRlbVxuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICogU2V0cyB0aGUgc3RhdGUgZm9yIHRoZSBob3Jpem9udGFsIGJ1bGxldCBuYXZpZ2F0aW9ucy5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gYWN0aXZlU2xpZGVzTmF2aWdhdGlvbihzbGlkZXNOYXYsIHNsaWRlSW5kZXgpIHtcbiAgICAgIGlmIChnZXRPcHRpb25zKCkuc2xpZGVzTmF2aWdhdGlvbiAmJiBzbGlkZXNOYXYgIT0gbnVsbCkge1xuICAgICAgICByZW1vdmVDbGFzcygkKEFDVElWRV9TRUwsIHNsaWRlc05hdiksIEFDVElWRSk7XG4gICAgICAgIGFkZENsYXNzKCQoJ2EnLCAkKCdsaScsIHNsaWRlc05hdilbc2xpZGVJbmRleF0pLCBBQ1RJVkUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAqIENyZWF0ZXMgYSBsYW5kc2NhcGUgbmF2aWdhdGlvbiBiYXIgd2l0aCBkb3RzIGZvciBob3Jpem9udGFsIHNsaWRlcnMuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGFkZFNsaWRlc05hdmlnYXRpb24oc2VjdGlvbikge1xuICAgICAgdmFyIHNlY3Rpb25FbGVtID0gc2VjdGlvbi5pdGVtO1xuICAgICAgdmFyIG51bVNsaWRlcyA9IHNlY3Rpb24uc2xpZGVzLmxlbmd0aDtcbiAgICAgIGFwcGVuZFRvKGNyZWF0ZUVsZW1lbnRGcm9tSFRNTCgnPGRpdiBjbGFzcz1cIicgKyBTTElERVNfTkFWICsgJ1wiPjx1bD48L3VsPjwvZGl2PicpLCBzZWN0aW9uRWxlbSk7XG4gICAgICB2YXIgbmF2ID0gJChTTElERVNfTkFWX1NFTCwgc2VjdGlvbkVsZW0pWzBdOyAvL3RvcCBvciBib3R0b21cblxuICAgICAgYWRkQ2xhc3MobmF2LCAnZnAtJyArIGdldE9wdGlvbnMoKS5zbGlkZXNOYXZQb3NpdGlvbik7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtU2xpZGVzOyBpKyspIHtcbiAgICAgICAgdmFyIHNsaWRlID0gJChTTElERV9TRUwsIHNlY3Rpb25FbGVtKVtpXTtcbiAgICAgICAgYXBwZW5kVG8oY3JlYXRlRWxlbWVudEZyb21IVE1MKCc8bGk+PGEgaHJlZj1cIiNcIj48c3BhbiBjbGFzcz1cImZwLXNyLW9ubHlcIj4nICsgZ2V0QnVsbGV0TGlua05hbWUoaSwgJ1NsaWRlJywgc2xpZGUpICsgJzwvc3Bhbj48c3Bhbj48L3NwYW4+PC9hPjwvbGk+JyksICQoJ3VsJywgbmF2KVswXSk7XG4gICAgICB9IC8vY2VudGVyaW5nIGl0XG5cblxuICAgICAgY3NzKG5hdiwge1xuICAgICAgICAnbWFyZ2luLWxlZnQnOiAnLScgKyBuYXYuaW5uZXJXaWR0aCAvIDIgKyAncHgnXG4gICAgICB9KTtcbiAgICAgIHZhciBhY3RpdmVTbGlkZUluZGV4ID0gc2VjdGlvbi5hY3RpdmVTbGlkZSA/IHNlY3Rpb24uYWN0aXZlU2xpZGUuaW5kZXgoKSA6IDA7XG4gICAgICBhZGRDbGFzcygkKCdhJywgJCgnbGknLCBuYXYpW2FjdGl2ZVNsaWRlSW5kZXhdKSwgQUNUSVZFKTtcbiAgICB9XG5cbiAgICB2YXIgaXNTY3JvbGxBbGxvd2VkID0ge307XG4gICAgaXNTY3JvbGxBbGxvd2VkLm0gPSB7XG4gICAgICAndXAnOiB0cnVlLFxuICAgICAgJ2Rvd24nOiB0cnVlLFxuICAgICAgJ2xlZnQnOiB0cnVlLFxuICAgICAgJ3JpZ2h0JzogdHJ1ZVxuICAgIH07XG4gICAgaXNTY3JvbGxBbGxvd2VkLmsgPSBkZWVwRXh0ZW5kKHt9LCBpc1Njcm9sbEFsbG93ZWQubSk7XG4gICAgLyoqXG4gICAgKiBBbGxvd2luZyBvciBkaXNhbGxvd2luZyB0aGUgbW91c2Uvc3dpcGUgc2Nyb2xsIGluIGEgZ2l2ZW4gZGlyZWN0aW9uLiAobm90IGZvciBrZXlib2FyZClcbiAgICAqIEBwYXJhbSB0eXBlIG0gKG1vdXNlKSBvciBrIChrZXlib2FyZClcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gc2V0SXNTY3JvbGxBbGxvd2VkKHZhbHVlLCBkaXJlY3Rpb24sIHR5cGUpIHtcbiAgICAgIC8vdXAsIGRvd24sIGxlZnQsIHJpZ2h0XG4gICAgICBpZiAoZGlyZWN0aW9uICE9PSAnYWxsJykge1xuICAgICAgICBpc1Njcm9sbEFsbG93ZWRbdHlwZV1bZGlyZWN0aW9uXSA9IHZhbHVlO1xuICAgICAgfSAvL2FsbCBkaXJlY3Rpb25zP1xuICAgICAgZWxzZSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGlzU2Nyb2xsQWxsb3dlZFt0eXBlXSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgaXNTY3JvbGxBbGxvd2VkW3R5cGVdW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldElzU2Nyb2xsQWxsb3dlZCgpIHtcbiAgICAgIHJldHVybiBpc1Njcm9sbEFsbG93ZWQ7XG4gICAgfVxuXG4gICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50cy5vbkNsaWNrT3JUb3VjaCwgb25DbGlja09yVG91Y2gkMik7XG5cbiAgICBmdW5jdGlvbiBvbkNsaWNrT3JUb3VjaCQyKHBhcmFtcykge1xuICAgICAgdmFyIHRhcmdldCA9IHBhcmFtcy50YXJnZXQ7XG5cbiAgICAgIGlmIChtYXRjaGVzKHRhcmdldCwgU0xJREVTX0FSUk9XX1NFTCkgfHwgY2xvc2VzdCh0YXJnZXQsIFNMSURFU19BUlJPV19TRUwpKSB7XG4gICAgICAgIHNsaWRlQXJyb3dIYW5kbGVyLmNhbGwodGFyZ2V0LCBwYXJhbXMpO1xuICAgICAgfVxuICAgIH0gLy9TY3JvbGxpbmcgaG9yaXpvbnRhbGx5IHdoZW4gY2xpY2tpbmcgb24gdGhlIHNsaWRlciBjb250cm9scy5cblxuXG4gICAgZnVuY3Rpb24gc2xpZGVBcnJvd0hhbmRsZXIoKSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdmFyIHNlY3Rpb24gPSBjbG9zZXN0KHRoaXMsIFNFQ1RJT05fU0VMKTtcbiAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG5cbiAgICAgIGlmIChoYXNDbGFzcyh0aGlzLCBTTElERVNfUFJFVikpIHtcbiAgICAgICAgaWYgKGdldElzU2Nyb2xsQWxsb3dlZCgpLm0ubGVmdCkge1xuICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgIHNjcm9sbFRyaWdnZXI6ICdzbGlkZUFycm93J1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50cy5tb3ZlU2xpZGVMZWZ0LCB7XG4gICAgICAgICAgICBzZWN0aW9uOiBzZWN0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChnZXRJc1Njcm9sbEFsbG93ZWQoKS5tLnJpZ2h0KSB7XG4gICAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2Nyb2xsVHJpZ2dlcjogJ3NsaWRlQXJyb3cnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRzLm1vdmVTbGlkZVJpZ2h0LCB7XG4gICAgICAgICAgICBzZWN0aW9uOiBzZWN0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgKiBDcmVhdGVzIHRoZSBjb250cm9sIGFycm93cyBmb3IgdGhlIGdpdmVuIHNlY3Rpb25cbiAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBjcmVhdGVTbGlkZUFycm93cyhzZWN0aW9uKSB7XG4gICAgICB2YXIgc2VjdGlvbkVsZW0gPSBzZWN0aW9uLml0ZW07XG4gICAgICB2YXIgYXJyb3dzID0gW2NyZWF0ZUVsZW1lbnRGcm9tSFRNTChnZXRPcHRpb25zKCkuY29udHJvbEFycm93c0hUTUxbMF0pLCBjcmVhdGVFbGVtZW50RnJvbUhUTUwoZ2V0T3B0aW9ucygpLmNvbnRyb2xBcnJvd3NIVE1MWzFdKV07XG4gICAgICBhZnRlcigkKFNMSURFU19XUkFQUEVSX1NFTCwgc2VjdGlvbkVsZW0pWzBdLCBhcnJvd3MpO1xuICAgICAgYWRkQ2xhc3MoYXJyb3dzLCBTTElERVNfQVJST1cpO1xuICAgICAgYWRkQ2xhc3MoYXJyb3dzWzBdLCBTTElERVNfUFJFVik7XG4gICAgICBhZGRDbGFzcyhhcnJvd3NbMV0sIFNMSURFU19ORVhUKTtcblxuICAgICAgaWYgKGdldE9wdGlvbnMoKS5jb250cm9sQXJyb3dDb2xvciAhPT0gJyNmZmYnKSB7XG4gICAgICAgIGNzcygkKFNMSURFU19BUlJPV19ORVhUX1NFTCwgc2VjdGlvbkVsZW0pLCB7XG4gICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICd0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAnICsgZ2V0T3B0aW9ucygpLmNvbnRyb2xBcnJvd0NvbG9yXG4gICAgICAgIH0pO1xuICAgICAgICBjc3MoJChTTElERVNfQVJST1dfUFJFVl9TRUwsIHNlY3Rpb25FbGVtKSwge1xuICAgICAgICAgICdib3JkZXItY29sb3InOiAndHJhbnNwYXJlbnQgJyArIGdldE9wdGlvbnMoKS5jb250cm9sQXJyb3dDb2xvciArICcgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQnXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWdldE9wdGlvbnMoKS5sb29wSG9yaXpvbnRhbCkge1xuICAgICAgICBoaWRlKCQoU0xJREVTX0FSUk9XX1BSRVZfU0VMLCBzZWN0aW9uRWxlbSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0b2dnbGVDb250cm9sQXJyb3dzKHYpIHtcbiAgICAgIGlmICghZ2V0T3B0aW9ucygpLmxvb3BIb3Jpem9udGFsICYmIGdldE9wdGlvbnMoKS5jb250cm9sQXJyb3dzKSB7XG4gICAgICAgIC8vaGlkZGluZyBpdCBmb3IgdGhlIGZpc3Qgc2xpZGUsIHNob3dpbmcgZm9yIHRoZSByZXN0XG4gICAgICAgIHRvZ2dsZSgkKFNMSURFU19BUlJPV19QUkVWX1NFTCwgdi5zZWN0aW9uKSwgdi5zbGlkZUluZGV4ICE9PSAwKTsgLy9oaWRkaW5nIGl0IGZvciB0aGUgbGFzdCBzbGlkZSwgc2hvd2luZyBmb3IgdGhlIHJlc3RcblxuICAgICAgICB0b2dnbGUoJChTTElERVNfQVJST1dfTkVYVF9TRUwsIHYuc2VjdGlvbiksIG5leHQodi5kZXN0aW55KSAhPSBudWxsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBGUC5zZXRSZWNvcmRIaXN0b3J5ID0gc2V0UmVjb3JkSGlzdG9yeTtcbiAgICAvKipcbiAgICAqIERlZmluZXMgd2hldGVyIHRvIHJlY29yZCB0aGUgaGlzdG9yeSBmb3IgZWFjaCBoYXNoIGNoYW5nZSBpbiB0aGUgVVJMLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBzZXRSZWNvcmRIaXN0b3J5KHZhbHVlLCB0eXBlKSB7XG4gICAgICBzZXRWYXJpYWJsZVN0YXRlKCdyZWNvcmRIaXN0b3J5JywgdmFsdWUsIHR5cGUpO1xuICAgIH1cblxuICAgIEZQLnNldEF1dG9TY3JvbGxpbmcgPSBzZXRBdXRvU2Nyb2xsaW5nO1xuICAgIEZQLnRlc3Quc2V0QXV0b1Njcm9sbGluZyA9IHNldEF1dG9TY3JvbGxpbmc7XG4gICAgLyoqXG4gICAgKiBTZXRzIHRoZSBhdXRvU2Nyb2xsIG9wdGlvbi5cbiAgICAqIEl0IGNoYW5nZXMgdGhlIHNjcm9sbCBiYXIgdmlzaWJpbGl0eSBhbmQgdGhlIGhpc3Rvcnkgb2YgdGhlIHNpdGUgYXMgYSByZXN1bHQuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHNldEF1dG9TY3JvbGxpbmcodmFsdWUsIHR5cGUpIHtcbiAgICAgIC8vcmVtb3ZpbmcgdGhlIHRyYW5zZm9ybWF0aW9uXG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHNpbGVudFNjcm9sbCgwKTtcbiAgICAgIH1cblxuICAgICAgc2V0VmFyaWFibGVTdGF0ZSgnYXV0b1Njcm9sbGluZycsIHZhbHVlLCB0eXBlKTtcbiAgICAgIHZhciBlbGVtZW50ID0gZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uLml0ZW07XG5cbiAgICAgIGlmIChnZXRPcHRpb25zKCkuYXV0b1Njcm9sbGluZyAmJiAhZ2V0T3B0aW9ucygpLnNjcm9sbEJhcikge1xuICAgICAgICBjc3MoJGh0bWxCb2R5LCB7XG4gICAgICAgICAgJ292ZXJmbG93JzogJ2hpZGRlbicsXG4gICAgICAgICAgJ2hlaWdodCc6ICcxMDAlJ1xuICAgICAgICB9KTtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoJGJvZHksICdmcC1zY3JvbGxhYmxlJyk7XG4gICAgICAgIHNldFJlY29yZEhpc3RvcnkoZ2V0T3JpZ2luYWxzKCkucmVjb3JkSGlzdG9yeSwgJ2ludGVybmFsJyk7IC8vZm9yIElFIHRvdWNoIGRldmljZXNcblxuICAgICAgICBjc3MoZ2V0Q29udGFpbmVyKCksIHtcbiAgICAgICAgICAnLW1zLXRvdWNoLWFjdGlvbic6ICdub25lJyxcbiAgICAgICAgICAndG91Y2gtYWN0aW9uJzogJ25vbmUnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAvL21vdmluZyB0aGUgY29udGFpbmVyIHVwXG4gICAgICAgICAgc2lsZW50U2Nyb2xsKGVsZW1lbnQub2Zmc2V0VG9wKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3NzKCRodG1sQm9keSwge1xuICAgICAgICAgICdvdmVyZmxvdyc6ICd2aXNpYmxlJyxcbiAgICAgICAgICAnaGVpZ2h0JzogJ2luaXRpYWwnXG4gICAgICAgIH0pO1xuICAgICAgICBhZGRDbGFzcygkYm9keSwgJ2ZwLXNjcm9sbGFibGUnKTtcbiAgICAgICAgdmFyIHJlY29yZEhpc3RvcnkgPSAhZ2V0T3B0aW9ucygpLmF1dG9TY3JvbGxpbmcgPyBmYWxzZSA6IGdldE9yaWdpbmFscygpLnJlY29yZEhpc3Rvcnk7XG4gICAgICAgIHNldFJlY29yZEhpc3RvcnkocmVjb3JkSGlzdG9yeSwgJ2ludGVybmFsJyk7IC8vZm9yIElFIHRvdWNoIGRldmljZXNcblxuICAgICAgICBjc3MoZ2V0Q29udGFpbmVyKCksIHtcbiAgICAgICAgICAnLW1zLXRvdWNoLWFjdGlvbic6ICcnLFxuICAgICAgICAgICd0b3VjaC1hY3Rpb24nOiAnJ1xuICAgICAgICB9KTsgLy9zY3JvbGxpbmcgdGhlIHBhZ2UgdG8gdGhlIHNlY3Rpb24gd2l0aCBubyBhbmltYXRpb25cblxuICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIHNjcm9sbFNldHRpbmdzID0gZ2V0U2Nyb2xsU2V0dGluZ3MoZWxlbWVudC5vZmZzZXRUb3ApO1xuICAgICAgICAgIHNjcm9sbFNldHRpbmdzLmVsZW1lbnQuc2Nyb2xsVG8oMCwgc2Nyb2xsU2V0dGluZ3Mub3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL0B0cy1jaGVja1xuICAgIC8qKlxuICAgICogQWRkcyBzZWN0aW9ucyBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGN1cnJlbnQgb25lIHRvIGNyZWF0ZSB0aGUgaW5maW5pdGUgZWZmZWN0LlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbmZpbml0ZVNlY3Rpb25zKHYpIHtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgaXNEb2luZ0NvbnRpbm91c1ZlcnRpY2FsOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHZhciBhY3RpdmVTZWN0aW9uSXRlbSA9IGdldFN0YXRlKCkuYWN0aXZlU2VjdGlvbi5pdGVtOyAvLyBTY3JvbGxpbmcgZG93blxuXG4gICAgICBpZiAoIXYuaXNNb3ZlbWVudFVwKSB7XG4gICAgICAgIC8vIE1vdmUgYWxsIHByZXZpb3VzIHNlY3Rpb25zIHRvIGFmdGVyIHRoZSBhY3RpdmUgc2VjdGlvblxuICAgICAgICBhZnRlcihhY3RpdmVTZWN0aW9uSXRlbSwgcHJldkFsbChhY3RpdmVTZWN0aW9uSXRlbSwgU0VDVElPTl9TRUwpLnJldmVyc2UoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTY3JvbGxpbmcgdXBcbiAgICAgICAgLy8gTW92ZSBhbGwgbmV4dCBzZWN0aW9ucyB0byBiZWZvcmUgdGhlIGFjdGl2ZSBzZWN0aW9uXG4gICAgICAgIGJlZm9yZShhY3RpdmVTZWN0aW9uSXRlbSwgbmV4dEFsbChhY3RpdmVTZWN0aW9uSXRlbSwgU0VDVElPTl9TRUwpKTtcbiAgICAgIH0gLy8gTWFpbnRhaW4gdGhlIGRpc3BsYXllZCBwb3NpdGlvbiAobm93IHRoYXQgd2UgY2hhbmdlZCB0aGUgZWxlbWVudCBvcmRlcilcblxuXG4gICAgICBzaWxlbnRTY3JvbGwoZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uLml0ZW0ub2Zmc2V0VG9wKTsgLy8gTWFpbnRhaW4gdGhlIGFjdGl2ZSBzbGlkZXMgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcblxuICAgICAga2VlcFNsaWRlc1Bvc2l0aW9uJDEoKTsgLy8gc2F2ZSBmb3IgbGF0ZXIgdGhlIGVsZW1lbnRzIHRoYXQgc3RpbGwgbmVlZCB0byBiZSByZW9yZGVyZWRcblxuICAgICAgdi53cmFwQXJvdW5kRWxlbWVudHMgPSBhY3RpdmVTZWN0aW9uSXRlbTsgLy8gUmVjYWxjdWxhdGUgYW5pbWF0aW9uIHZhcmlhYmxlc1xuXG4gICAgICB2LmR0b3AgPSB2LmVsZW1lbnQub2Zmc2V0VG9wO1xuICAgICAgdi55TW92ZW1lbnQgPSBnZXRZbW92ZW1lbnQoZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uLCB2LmVsZW1lbnQpO1xuICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIC8qKlxuICAgICogTWFpbnRhaW5zIHRoZSBhY3RpdmUgc2xpZGVzIGluIHRoZSB2aWV3cG9ydFxuICAgICogKEJlY2F1c2UgdGhlIGBzY3JvbGxgIGFuaW1hdGlvbiBtaWdodCBnZXQgbG9zdCB3aXRoIHNvbWUgYWN0aW9ucywgc3VjaCBhcyB3aGVuIHVzaW5nIGNvbnRpbnVvdXNWZXJ0aWNhbClcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24ga2VlcFNsaWRlc1Bvc2l0aW9uJDEoKSB7XG4gICAgICB2YXIgYWN0aXZlU2xpZGVzID0gJChTTElERV9BQ1RJVkVfU0VMKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhY3RpdmVTbGlkZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2lsZW50TGFuZHNjYXBlU2Nyb2xsKGFjdGl2ZVNsaWRlc1tpXSwgJ2ludGVybmFsJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9AdHMtY2hlY2tcbiAgICAvKipcbiAgICAqIE1haW50YWlucyB0aGUgYWN0aXZlIHNsaWRlcyBpbiB0aGUgdmlld3BvcnRcbiAgICAqIChCZWNhdXNlIHRoZSBgc2Nyb2xsYCBhbmltYXRpb24gbWlnaHQgZ2V0IGxvc3Qgd2l0aCBzb21lIGFjdGlvbnMsIHN1Y2ggYXMgd2hlbiB1c2luZyBjb250aW51b3VzVmVydGljYWwpXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGtlZXBTbGlkZXNQb3NpdGlvbigpIHtcbiAgICAgIHZhciBhY3RpdmVTbGlkZXMgPSAkKFNMSURFX0FDVElWRV9TRUwpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFjdGl2ZVNsaWRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzaWxlbnRMYW5kc2NhcGVTY3JvbGwoYWN0aXZlU2xpZGVzW2ldLCAnaW50ZXJuYWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgKiBGaXggc2VjdGlvbiBvcmRlciBhZnRlciBjb250aW51b3VzVmVydGljYWwgY2hhbmdlcyBoYXZlIGJlZW4gYW5pbWF0ZWRcbiAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBjb250aW51b3VzVmVydGljYWxGaXhTZWN0aW9uT3JkZXIodikge1xuICAgICAgLy8gSWYgY29udGludW91c1ZlcnRpY2FsIGlzIGluIGVmZmVjdCAoYW5kIGF1dG9TY3JvbGxpbmcgd291bGQgYWxzbyBiZSBpbiBlZmZlY3QgdGhlbiksXG4gICAgICAvLyBmaW5pc2ggbW92aW5nIHRoZSBlbGVtZW50cyBhcm91bmQgc28gdGhlIGRpcmVjdCBuYXZpZ2F0aW9uIHdpbGwgZnVuY3Rpb24gbW9yZSBzaW1wbHlcbiAgICAgIGlmICh2LndyYXBBcm91bmRFbGVtZW50cyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHYuaXNNb3ZlbWVudFVwKSB7XG4gICAgICAgIGJlZm9yZSgkKFNFQ1RJT05fU0VMKVswXSwgdi53cmFwQXJvdW5kRWxlbWVudHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWZ0ZXIoJChTRUNUSU9OX1NFTClbZ2V0U3RhdGUoKS5zZWN0aW9ucy5sZW5ndGggLSAxXSwgdi53cmFwQXJvdW5kRWxlbWVudHMpO1xuICAgICAgfVxuXG4gICAgICBzaWxlbnRTY3JvbGwoZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uLml0ZW0ub2Zmc2V0VG9wKTsgLy8gTWFpbnRhaW4gdGhlIGFjdGl2ZSBzbGlkZXMgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcblxuICAgICAga2VlcFNsaWRlc1Bvc2l0aW9uKCk7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGlzRG9pbmdDb250aW5vdXNWZXJ0aWNhbDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogTWFrZXMgc3VyZSBsYXp5bG9hZCBpcyBkb25lIGZvciBvdGhlciBzZWN0aW9ucyBpbiB0aGUgdmlld3BvcnQgdGhhdCBhcmUgbm90IHRoZVxuICAgICogYWN0aXZlIG9uZS4gXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGxhenlMb2FkT3RoZXJzKCkge1xuICAgICAgdmFyIGhhc0F1dG9IZWlnaHRTZWN0aW9ucyA9ICQoQVVUT19IRUlHSFRfU0VMKVswXSB8fCBpc1Jlc3BvbnNpdmVNb2RlKCkgJiYgJChBVVRPX0hFSUdIVF9SRVNQT05TSVZFX1NFTClbMF07IC8vcXVpdHRpbmcgd2hlbiBpdCBkb2Vzbid0IGFwcGx5XG5cbiAgICAgIGlmICghZ2V0T3B0aW9ucygpLmxhenlMb2FkaW5nIHx8ICFoYXNBdXRvSGVpZ2h0U2VjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvL21ha2luZyBzdXJlIHRvIGxhenkgbG9hZCBhdXRvLWhlaWdodCBzZWN0aW9ucyB0aGF0IGFyZSBpbiB0aGUgdmlld3BvcnRcblxuXG4gICAgICAkKFNFQ1RJT05fU0VMICsgJzpub3QoJyArIEFDVElWRV9TRUwgKyAnKScpLmZvckVhY2goZnVuY3Rpb24gKHNlY3Rpb24pIHtcbiAgICAgICAgaWYgKGlzU2VjdGlvbkluVmlld3BvcnQoc2VjdGlvbikpIHtcbiAgICAgICAgICBsYXp5TG9hZChzZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc2VjdGlvbiBpcyBpbiB0aGUgdmlld3BvcnQgb3Igbm90LlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBpc1NlY3Rpb25JblZpZXdwb3J0KGVsKSB7XG4gICAgICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIHRvcCA9IHJlY3QudG9wO1xuICAgICAgdmFyIGJvdHRvbSA9IHJlY3QuYm90dG9tOyAvL3NvbWV0aW1lcyB0aGVyZSdzIGEgMXB4IG9mZnNldCBvbiB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gZXZlbiB3aGVuIHRoZSBcbiAgICAgIC8vc2VjdGlvbidzIGhlaWdodCBpcyB0aGUgd2luZG93LmlubmVySGVpZ2h0IG9uZS4gSSBndWVzcyBiZWNhdXNlIHBpeGVscyB3b24ndCBhbGxvdyBkZWNpbWFscy5cbiAgICAgIC8vdXNpbmcgdGhpcyBwcmV2ZW50cyBmcm9tIGxhenlMb2FkaW5nIHRoZSBzZWN0aW9uIHRoYXQgaXMgbm90IHlldCB2aXNpYmxlIFxuICAgICAgLy8ob25seSAxIHBpeGVsIG9mZnNldCBpcylcblxuICAgICAgdmFyIHBpeGVsT2Zmc2V0ID0gMjtcbiAgICAgIHZhciBpc1RvcEluVmlldyA9IHRvcCArIHBpeGVsT2Zmc2V0IDwgc3RhdGUud2luZG93c0hlaWdodCAmJiB0b3AgPiAwO1xuICAgICAgdmFyIGlzQm90dG9tSW5WaWV3ID0gYm90dG9tID4gcGl4ZWxPZmZzZXQgJiYgYm90dG9tIDwgc3RhdGUud2luZG93c0hlaWdodDtcbiAgICAgIHJldHVybiBpc1RvcEluVmlldyB8fCBpc0JvdHRvbUluVmlldztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b29sdGlwVGV4dEhhbmRsZXIoKSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdHJpZ2dlcihwcmV2KHRoaXMpLCAnY2xpY2snKTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBBY3RpdmF0aW5nIHRoZSB2ZXJ0aWNhbCBuYXZpZ2F0aW9uIGJ1bGxldHMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzbGlkZSBuYW1lLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBhY3RpdmF0ZU5hdkRvdHMobmFtZSwgc2VjdGlvbkluZGV4KSB7XG4gICAgICB2YXIgbmF2ID0gJChTRUNUSU9OX05BVl9TRUwpWzBdO1xuXG4gICAgICBpZiAoZ2V0T3B0aW9ucygpLm5hdmlnYXRpb24gJiYgbmF2ICE9IG51bGwgJiYgbmF2LnN0eWxlLmRpc3BsYXkgIT09ICdub25lJykge1xuICAgICAgICByZW1vdmVDbGFzcygkKEFDVElWRV9TRUwsIG5hdiksIEFDVElWRSk7XG5cbiAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICBhZGRDbGFzcygkKCdhW2hyZWY9XCIjJyArIG5hbWUgKyAnXCJdJywgbmF2KSwgQUNUSVZFKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRDbGFzcygkKCdhJywgJCgnbGknLCBuYXYpW3NlY3Rpb25JbmRleF0pLCBBQ1RJVkUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICogQ3JlYXRlcyBhIHZlcnRpY2FsIG5hdmlnYXRpb24gYmFyLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBhZGRWZXJ0aWNhbE5hdmlnYXRpb24oKSB7XG4gICAgICByZW1vdmUoJChTRUNUSU9OX05BVl9TRUwpKTtcbiAgICAgIHZhciBuYXZpZ2F0aW9uID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbmF2aWdhdGlvbi5zZXRBdHRyaWJ1dGUoJ2lkJywgU0VDVElPTl9OQVYpO1xuICAgICAgdmFyIGRpdlVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG4gICAgICBuYXZpZ2F0aW9uLmFwcGVuZENoaWxkKGRpdlVsKTtcbiAgICAgIGFwcGVuZFRvKG5hdmlnYXRpb24sICRib2R5KTtcbiAgICAgIHZhciBuYXYgPSAkKFNFQ1RJT05fTkFWX1NFTClbMF07XG4gICAgICBhZGRDbGFzcyhuYXYsICdmcC0nICsgZ2V0T3B0aW9ucygpLm5hdmlnYXRpb25Qb3NpdGlvbik7XG5cbiAgICAgIGlmIChnZXRPcHRpb25zKCkuc2hvd0FjdGl2ZVRvb2x0aXApIHtcbiAgICAgICAgYWRkQ2xhc3MobmF2LCBTSE9XX0FDVElWRV9UT09MVElQKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGxpID0gJyc7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2V0U3RhdGUoKS5zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2VjdGlvbiA9IGdldFN0YXRlKCkuc2VjdGlvbnNbaV07XG4gICAgICAgIHZhciBsaW5rID0gJyc7XG5cbiAgICAgICAgaWYgKGdldE9wdGlvbnMoKS5hbmNob3JzLmxlbmd0aCkge1xuICAgICAgICAgIGxpbmsgPSBzZWN0aW9uLmFuY2hvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpICs9ICc8bGk+PGEgaHJlZj1cIiMnICsgZW5jb2RlVVJJKGxpbmspICsgJ1wiPjxzcGFuIGNsYXNzPVwiZnAtc3Itb25seVwiPicgKyBnZXRCdWxsZXRMaW5rTmFtZShzZWN0aW9uLmluZGV4KCksICdTZWN0aW9uJykgKyAnPC9zcGFuPjxzcGFuPjwvc3Bhbj48L2E+JzsgLy8gT25seSBhZGQgdG9vbHRpcCBpZiBuZWVkZWQgKGRlZmluZWQgYnkgdXNlcilcblxuICAgICAgICB2YXIgdG9vbHRpcCA9IGdldE9wdGlvbnMoKS5uYXZpZ2F0aW9uVG9vbHRpcHNbc2VjdGlvbi5pbmRleCgpXTtcblxuICAgICAgICBpZiAodHlwZW9mIHRvb2x0aXAgIT09ICd1bmRlZmluZWQnICYmIHRvb2x0aXAgIT09ICcnKSB7XG4gICAgICAgICAgbGkgKz0gJzxkaXYgY2xhc3M9XCInICsgU0VDVElPTl9OQVZfVE9PTFRJUCArICcgZnAtJyArIGdldE9wdGlvbnMoKS5uYXZpZ2F0aW9uUG9zaXRpb24gKyAnXCI+JyArIHRvb2x0aXAgKyAnPC9kaXY+JztcbiAgICAgICAgfVxuXG4gICAgICAgIGxpICs9ICc8L2xpPic7XG4gICAgICB9XG5cbiAgICAgICQoJ3VsJywgbmF2KVswXS5pbm5lckhUTUwgPSBsaTsgLy9hY3RpdmF0aW5nIHRoZSBjdXJyZW50IGFjdGl2ZSBzZWN0aW9uXG5cbiAgICAgIHZhciBidWxsZXQgPSAkKCdsaScsICQoU0VDVElPTl9OQVZfU0VMKVswXSlbZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uLmluZGV4KCldO1xuICAgICAgYWRkQ2xhc3MoJCgnYScsIGJ1bGxldCksIEFDVElWRSk7XG4gICAgfSAvL1Njcm9sbHMgdG8gdGhlIHNlY3Rpb24gd2hlbiBjbGlja2luZyB0aGUgbmF2aWdhdGlvbiBidWxsZXRcblxuICAgIGZ1bmN0aW9uIHNlY3Rpb25CdWxsZXRIYW5kbGVyKGUpIHtcbiAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIHByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgfVxuXG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFRyaWdnZXI6ICd2ZXJ0aWNhbE5hdidcbiAgICAgIH0pO1xuICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgIC8vIEB0cy1pZ25vcmVcblxuICAgICAgdmFyIGluZGV4QnVsbGV0ID0gaW5kZXgoY2xvc2VzdCh0aGlzLCBTRUNUSU9OX05BVl9TRUwgKyAnIGxpJykpO1xuICAgICAgRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRzLnNjcm9sbFBhZ2UsIHtcbiAgICAgICAgZGVzdGluYXRpb246IGdldFN0YXRlKCkuc2VjdGlvbnNbaW5kZXhCdWxsZXRdXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFNldHMgdG8gYWN0aXZlIHRoZSBjdXJyZW50IG1lbnUgYW5kIHZlcnRpY2FsIG5hdiBpdGVtcy5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gYWN0aXZhdGVNZW51QW5kTmF2KGFuY2hvciwgaW5kZXgpIHtcbiAgICAgIGFjdGl2YXRlTWVudUVsZW1lbnQoYW5jaG9yKTtcbiAgICAgIGFjdGl2YXRlTmF2RG90cyhhbmNob3IsIGluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBBY3RpdmF0aW5nIHRoZSB3ZWJzaXRlIG1haW4gbWVudSBlbGVtZW50cyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHNsaWRlIG5hbWUuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGFjdGl2YXRlTWVudUVsZW1lbnQobmFtZSkge1xuICAgICAgaWYgKGdldE9wdGlvbnMoKS5tZW51ICYmIGdldE9wdGlvbnMoKS5tZW51Lmxlbmd0aCkge1xuICAgICAgICAkKGdldE9wdGlvbnMoKS5tZW51KS5mb3JFYWNoKGZ1bmN0aW9uIChtZW51KSB7XG4gICAgICAgICAgaWYgKG1lbnUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoJChBQ1RJVkVfU0VMLCBtZW51KSwgQUNUSVZFKTtcbiAgICAgICAgICAgIGFkZENsYXNzKCQoJ1tkYXRhLW1lbnVhbmNob3I9XCInICsgbmFtZSArICdcIl0nLCBtZW51KSwgQUNUSVZFKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJzIHRoZSBjYWxsYmFjayBvbmNlIHBlciBzY3JvbGwgd2hlZWwgYWN0aW9uLlxuICAgICAqIEJhc2VkIG9uIHNjcm9sbGluZyBzcGVlZCBkZWxheS5cbiAgICAgKi9cblxuICAgIHZhciBvbmNlUGVyU2Nyb2xsID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNhblRyaWdnZXJFdmVudCA9IHRydWU7XG4gICAgICB2YXIgcHJldldoZWVsVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIHZhciBpc1Njcm9sbGluZ09uSW5pdCA9ICF3aW4uZnVsbHBhZ2VfYXBpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzY3JvbGxUcmlnZ2VyLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdmFyIHRpbWVUaHJlc2hvbGQgPSBzY3JvbGxUcmlnZ2VyID09PSAnd2hlZWwnID8gZ2V0T3B0aW9ucygpLnNjcm9sbGluZ1NwZWVkIDogMTAwO1xuICAgICAgICBjYW5UcmlnZ2VyRXZlbnQgPSBpc1Njcm9sbGluZ09uSW5pdCB8fCBjdXJyZW50VGltZSAtIHByZXZXaGVlbFRpbWUgPj0gdGltZVRocmVzaG9sZDtcbiAgICAgICAgaXNTY3JvbGxpbmdPbkluaXQgPSAhd2luLmZ1bGxwYWdlX2FwaTtcblxuICAgICAgICBpZiAoY2FuVHJpZ2dlckV2ZW50KSB7XG4gICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2soKTtcbiAgICAgICAgICBwcmV2V2hlZWxUaW1lID0gY3VycmVudFRpbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcgPyByZXN1bHQgOiB0cnVlO1xuICAgICAgfTtcbiAgICB9KCk7XG5cbiAgICAvKipcbiAgICAqIEZpcmVzIHRoZSB3aGVlbCBldmVudCBvbmNlIHBlciBtb3VzZSB3aGVlbCB0cmlnZ2VyLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBmaXJlQ2FsbGJhY2tPbmNlUGVyU2Nyb2xsKGNhbGxiYWNrTmFtZSwgcGFyYW1zKSB7XG4gICAgICBpZiAoIWlzRnVuY3Rpb24oZ2V0T3B0aW9ucygpLmJlZm9yZUxlYXZlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciByZXN1bHQgPSBvbmNlUGVyU2Nyb2xsKGdldFN0YXRlKCkuc2Nyb2xsVHJpZ2dlciwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmlyZUNhbGxiYWNrKGNhbGxiYWNrTmFtZSwgcGFyYW1zKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBGUC5tb3ZlVG8gPSBtb3ZlVG87XG5cbiAgICBGUC5nZXRTY3JvbGxZID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHN0YXRlLnNjcm9sbFk7XG4gICAgfTtcblxuICAgIHZhciBnX2FmdGVyU2VjdGlvbkxvYWRzSWQ7XG4gICAgdmFyIGdfdHJhbnNpdGlvbkxhcHNlSWQ7XG4gICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50cy5vbkRlc3Ryb3ksIG9uRGVzdHJveSQ4KTtcbiAgICAvKipcbiAgICAqIFNjcm9sbHMgdGhlIHNpdGUgdG8gdGhlIGdpdmVuIGVsZW1lbnQgYW5kIHNjcm9sbHMgdG8gdGhlIHNsaWRlIGlmIGEgY2FsbGJhY2sgaXMgZ2l2ZW4uXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHNjcm9sbFBhZ2Uoc2VjdGlvbiwgY2FsbGJhY2ssIGlzTW92ZW1lbnRVcCkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBzZWN0aW9uLml0ZW07XG5cbiAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvL3RoZXJlJ3Mgbm8gZWxlbWVudCB0byBzY3JvbGwsIGxlYXZpbmcgdGhlIGZ1bmN0aW9uXG5cblxuICAgICAgdmFyIGR0b3AgPSBnZXREZXN0aW5hdGlvblBvc2l0aW9uKGVsZW1lbnQpO1xuICAgICAgdmFyIHNsaWRlQW5jaG9yTGluaztcbiAgICAgIHZhciBzbGlkZUluZGV4OyAvL2xvY2FsIHZhcmlhYmxlc1xuXG4gICAgICB2YXIgdiA9IHtcbiAgICAgICAgXCJlbGVtZW50XCI6IGVsZW1lbnQsXG4gICAgICAgIFwiY2FsbGJhY2tcIjogY2FsbGJhY2ssXG4gICAgICAgIFwiaXNNb3ZlbWVudFVwXCI6IGlzTW92ZW1lbnRVcCxcbiAgICAgICAgXCJkdG9wXCI6IGR0b3AsXG4gICAgICAgIFwieU1vdmVtZW50XCI6IGdldFltb3ZlbWVudChnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb24sIGVsZW1lbnQpLFxuICAgICAgICBcImFuY2hvckxpbmtcIjogc2VjdGlvbi5hbmNob3IsXG4gICAgICAgIFwic2VjdGlvbkluZGV4XCI6IHNlY3Rpb24uaW5kZXgoKSxcbiAgICAgICAgXCJhY3RpdmVTbGlkZVwiOiBzZWN0aW9uLmFjdGl2ZVNsaWRlID8gc2VjdGlvbi5hY3RpdmVTbGlkZS5pdGVtIDogbnVsbCxcbiAgICAgICAgXCJsZWF2aW5nU2VjdGlvblwiOiBnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb24uaW5kZXgoKSArIDEsXG4gICAgICAgIC8vY2FjaGluZyB0aGUgdmFsdWUgb2YgaXNSZXNpemluZyBhdCB0aGUgbW9tbWVudCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkXG4gICAgICAgIC8vYmVjYXVzZSBpdCB3aWxsIGJlIGNoZWNrZWQgbGF0ZXIgaW5zaWRlIGEgc2V0VGltZW91dCBhbmQgdGhlIHZhbHVlIG1pZ2h0IGNoYW5nZVxuICAgICAgICBcImxvY2FsSXNSZXNpemluZ1wiOiBzdGF0ZS5pc1Jlc2l6aW5nLFxuICAgICAgICBcIml0ZW1zXCI6IHtcbiAgICAgICAgICBcIm9yaWdpblwiOiBnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb24sXG4gICAgICAgICAgXCJkZXN0aW5hdGlvblwiOiBzZWN0aW9uXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGlyZWN0aW9uXCI6IG51bGxcbiAgICAgIH07IC8vcXVpdGluZyB3aGVuIGRlc3RpbmF0aW9uIHNjcm9sbCBpcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBvbmVcblxuICAgICAgaWYgKGdldFN0YXRlKCkuYWN0aXZlU2VjdGlvbi5pdGVtID09IGVsZW1lbnQgJiYgIXN0YXRlLmlzUmVzaXppbmcgfHwgZ2V0T3B0aW9ucygpLnNjcm9sbEJhciAmJiBnZXRTY3JvbGxUb3AoKSA9PT0gdi5kdG9wICYmICFoYXNDbGFzcyhlbGVtZW50LCBBVVRPX0hFSUdIVCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodi5hY3RpdmVTbGlkZSAhPSBudWxsKSB7XG4gICAgICAgIHNsaWRlQW5jaG9yTGluayA9IGdldEF0dHIodi5hY3RpdmVTbGlkZSwgJ2RhdGEtYW5jaG9yJyk7XG4gICAgICAgIHNsaWRlSW5kZXggPSBpbmRleCh2LmFjdGl2ZVNsaWRlLCBudWxsKTtcbiAgICAgIH0gLy9jYWxsYmFjayAob25MZWF2ZSkgaWYgdGhlIHNpdGUgaXMgbm90IGp1c3QgcmVzaXppbmcgYW5kIHJlYWRqdXN0aW5nIHRoZSBzbGlkZXNcblxuXG4gICAgICBpZiAoIXYubG9jYWxJc1Jlc2l6aW5nKSB7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSB2LnlNb3ZlbWVudDsgLy9yZXF1aXJlZCBmb3IgY29udGlub3VzVmVydGljYWxcblxuICAgICAgICBpZiAodHlwZW9mIGlzTW92ZW1lbnRVcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBkaXJlY3Rpb24gPSBpc01vdmVtZW50VXAgPyAndXAnIDogJ2Rvd24nO1xuICAgICAgICB9IC8vZm9yIHRoZSBjYWxsYmFja1xuXG5cbiAgICAgICAgdi5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oZ2V0T3B0aW9ucygpLmJlZm9yZUxlYXZlKSkge1xuICAgICAgICAgIGlmIChmaXJlQ2FsbGJhY2tPbmNlUGVyU2Nyb2xsKCdiZWZvcmVMZWF2ZScsIHYpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGdldE9wdGlvbnMoKS5vbkxlYXZlKSkge1xuICAgICAgICAgIGlmICghZmlyZUNhbGxiYWNrKCdvbkxlYXZlJywgdikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gLy8gSWYgY29udGludW91c1ZlcnRpY2FsICYmIHdlIG5lZWQgdG8gd3JhcCBhcm91bmRcblxuXG4gICAgICBpZiAoZ2V0T3B0aW9ucygpLmF1dG9TY3JvbGxpbmcgJiYgZ2V0T3B0aW9ucygpLmNvbnRpbnVvdXNWZXJ0aWNhbCAmJiB0eXBlb2Ygdi5pc01vdmVtZW50VXAgIT09IFwidW5kZWZpbmVkXCIgJiYgKCF2LmlzTW92ZW1lbnRVcCAmJiB2LnlNb3ZlbWVudCA9PSAndXAnIHx8IC8vIEludGVuZGluZyB0byBzY3JvbGwgZG93biBidXQgYWJvdXQgdG8gZ28gdXAgb3JcbiAgICAgIHYuaXNNb3ZlbWVudFVwICYmIHYueU1vdmVtZW50ID09ICdkb3duJykpIHtcbiAgICAgICAgLy8gaW50ZW5kaW5nIHRvIHNjcm9sbCB1cCBidXQgYWJvdXQgdG8gZ28gZG93blxuICAgICAgICB2ID0gY3JlYXRlSW5maW5pdGVTZWN0aW9ucyh2KTtcbiAgICAgIH0gLy9wYXVzaW5nIG1lZGlhIG9mIHRoZSBsZWF2aW5nIHNlY3Rpb24gKGlmIHdlIGFyZSBub3QganVzdCByZXNpemluZywgYXMgZGVzdGluYXRpbm8gd2lsbCBiZSB0aGUgc2FtZSBvbmUpXG5cblxuICAgICAgaWYgKCF2LmxvY2FsSXNSZXNpemluZykge1xuICAgICAgICBzdG9wTWVkaWEoZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uLml0ZW0pO1xuICAgICAgfVxuXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBBQ1RJVkUpO1xuICAgICAgcmVtb3ZlQ2xhc3Moc2libGluZ3MoZWxlbWVudCksIEFDVElWRSk7XG4gICAgICB1cGRhdGVTdGF0ZSgpO1xuICAgICAgbGF6eUxvYWQoZWxlbWVudCk7IC8vcHJldmVudGluZyBmcm9tIGFjdGl2YXRpbmcgdGhlIE1vdXNlV2hlZWxIYW5kbGVyIGV2ZW50XG4gICAgICAvL21vcmUgdGhhbiBvbmNlIGlmIHRoZSBwYWdlIGlzIHNjcm9sbGluZ1xuXG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGNhblNjcm9sbDogRlAudGVzdC5pc1Rlc3RpbmdcbiAgICAgIH0pO1xuICAgICAgc2V0UGFnZVN0YXR1cyhzbGlkZUluZGV4LCBzbGlkZUFuY2hvckxpbmssIHYuYW5jaG9yTGluayk7XG4gICAgICBFdmVudEVtaXR0ZXIuZW1pdChldmVudHMub25MZWF2ZSwgdik7XG4gICAgICBwZXJmb3JtTW92ZW1lbnQodik7IC8vZmxhZyB0byBhdm9pZCBjYWxsaW5nbiBgc2Nyb2xsUGFnZSgpYCB0d2ljZSBpbiBjYXNlIG9mIHVzaW5nIGFuY2hvciBsaW5rc1xuXG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGxhc3RTY3JvbGxlZERlc3Rpbnk6IHYuYW5jaG9yTGlua1xuICAgICAgfSk7IC8vYXZvaWQgZmlyaW5nIGl0IHR3aWNlIChhcyBpdCBkb2VzIGFsc28gb24gc2Nyb2xsKVxuXG4gICAgICBhY3RpdmF0ZU1lbnVBbmROYXYodi5hbmNob3JMaW5rLCB2LnNlY3Rpb25JbmRleCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25EZXN0cm95JDgoKSB7XG4gICAgICBjbGVhclRpbWVvdXQoZ19hZnRlclNlY3Rpb25Mb2Fkc0lkKTtcbiAgICAgIGNsZWFyVGltZW91dChnX3RyYW5zaXRpb25MYXBzZUlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBkZXN0aW5hdGlvbiBZIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBzY3JvbGxpbmcgZGlyZWN0aW9uIGFuZFxuICAgICogdGhlIGhlaWdodCBvZiB0aGUgc2VjdGlvbi5cbiAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBnZXREZXN0aW5hdGlvblBvc2l0aW9uKGVsZW1lbnQpIHtcbiAgICAgIHZhciBlbGVtZW50SGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICB2YXIgZWxlbWVudFRvcCA9IGVsZW1lbnQub2Zmc2V0VG9wOyAvL3RvcCBvZiB0aGUgZGVzaW5hdGlvbiB3aWxsIGJlIGF0IHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0XG5cbiAgICAgIHZhciBwb3NpdGlvbiA9IGVsZW1lbnRUb3A7XG4gICAgICB2YXIgaXNTY3JvbGxpbmdEb3duID0gZWxlbWVudFRvcCA+IHN0YXRlLnByZXZpb3VzRGVzdFRvcDtcbiAgICAgIHZhciBzZWN0aW9uQm90dG9tID0gcG9zaXRpb24gLSBnZXRXaW5kb3dIZWlnaHQoKSArIGVsZW1lbnRIZWlnaHQ7XG4gICAgICB2YXIgYmlnU2VjdGlvbnNEZXN0aW5hdGlvbiA9IGdldE9wdGlvbnMoKS5iaWdTZWN0aW9uc0Rlc3RpbmF0aW9uOyAvL2lzIHRoZSBkZXN0aW5hdGlvbiBlbGVtZW50IGJpZ2dlciB0aGFuIHRoZSB2aWV3cG9ydD9cblxuICAgICAgaWYgKGVsZW1lbnRIZWlnaHQgPiBnZXRXaW5kb3dIZWlnaHQoKSkge1xuICAgICAgICAvL3Njcm9sbGluZyB1cD9cbiAgICAgICAgaWYgKCFpc1Njcm9sbGluZ0Rvd24gJiYgIWJpZ1NlY3Rpb25zRGVzdGluYXRpb24gfHwgYmlnU2VjdGlvbnNEZXN0aW5hdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICBwb3NpdGlvbiA9IHNlY3Rpb25Cb3R0b207XG4gICAgICAgIH1cbiAgICAgIH0gLy9zZWN0aW9ucyBlcXVhbCBvciBzbWFsbGVyIHRoYW4gdGhlIHZpZXdwb3J0IGhlaWdodCAmJiBzY3JvbGxpbmcgZG93bj8gfHwgIGlzIHJlc2l6aW5nIGFuZCBpdHMgaW4gdGhlIGxhc3Qgc2VjdGlvblxuICAgICAgZWxzZSBpZiAoaXNTY3JvbGxpbmdEb3duIHx8IHN0YXRlLmlzUmVzaXppbmcgJiYgbmV4dChlbGVtZW50KSA9PSBudWxsKSB7XG4gICAgICAgIC8vVGhlIGJvdHRvbSBvZiB0aGUgZGVzdGluYXRpb24gd2lsbCBiZSBhdCB0aGUgYm90dG9tIG9mIHRoZSB2aWV3cG9ydFxuICAgICAgICBwb3NpdGlvbiA9IHNlY3Rpb25Cb3R0b207XG4gICAgICB9XG4gICAgICAvKlxuICAgICAgS2VlcGluZyByZWNvcmQgb2YgdGhlIGxhc3Qgc2Nyb2xsZWQgcG9zaXRpb24gdG8gZGV0ZXJtaW5lIHRoZSBzY3JvbGxpbmcgZGlyZWN0aW9uLlxuICAgICAgTm8gY29udmVudGlvbmFsIG1ldGhvZHMgY2FuIGJlIHVzZWQgYXMgdGhlIHNjcm9sbCBiYXIgbWlnaHQgbm90IGJlIHByZXNlbnRcbiAgICAgIEFORCB0aGUgc2VjdGlvbiBtaWdodCBub3QgYmUgYWN0aXZlIGlmIGl0IGlzIGF1dG8taGVpZ2h0IGFuZCBkaWRudCByZWFjaCB0aGUgbWlkZGxlXG4gICAgICBvZiB0aGUgdmlld3BvcnQuXG4gICAgICAqL1xuXG5cbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgcHJldmlvdXNEZXN0VG9wOiBwb3NpdGlvblxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfVxuICAgIC8qKlxuICAgICogUGVyZm9ybXMgdGhlIHZlcnRpY2FsIG1vdmVtZW50IChieSBDU1MzIG9yIGJ5IGpRdWVyeSlcbiAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBwZXJmb3JtTW92ZW1lbnQodikge1xuICAgICAgdmFyIGlzRmFzdFNwZWVkID0gZ2V0T3B0aW9ucygpLnNjcm9sbGluZ1NwZWVkIDwgNzAwO1xuICAgICAgdmFyIHRyYW5zaXRpb25MYXBzZSA9IGlzRmFzdFNwZWVkID8gNzAwIDogZ2V0T3B0aW9ucygpLnNjcm9sbGluZ1NwZWVkO1xuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICB0b3VjaERpcmVjdGlvbjogJ25vbmUnLFxuICAgICAgICBzY3JvbGxZOiBNYXRoLnJvdW5kKHYuZHRvcClcbiAgICAgIH0pO1xuICAgICAgRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRzLm9uUGVyZm9ybU1vdmVtZW50KTsgLy8gdXNpbmcgQ1NTMyB0cmFuc2xhdGUgZnVuY3Rpb25hbGl0eVxuXG4gICAgICBpZiAoZ2V0T3B0aW9ucygpLmNzczMgJiYgZ2V0T3B0aW9ucygpLmF1dG9TY3JvbGxpbmcgJiYgIWdldE9wdGlvbnMoKS5zY3JvbGxCYXIpIHtcbiAgICAgICAgLy8gVGhlIGZpcnN0IHNlY3Rpb24gY2FuIGhhdmUgYSBuZWdhdGl2ZSB2YWx1ZSBpbiBpT1MgMTAuIE5vdCBxdWl0ZSBzdXJlIHdoeTogLTAuMDE0MjgyMjI2NTYyNVxuICAgICAgICAvLyB0aGF0J3Mgd2h5IHdlIHJvdW5kIGl0IHRvIDAuXG4gICAgICAgIHZhciB0cmFuc2xhdGUzZCA9ICd0cmFuc2xhdGUzZCgwcHgsIC0nICsgTWF0aC5yb3VuZCh2LmR0b3ApICsgJ3B4LCAwcHgpJztcbiAgICAgICAgdHJhbnNmb3JtQ29udGFpbmVyKHRyYW5zbGF0ZTNkLCB0cnVlKTsgLy9ldmVuIHdoZW4gdGhlIHNjcm9sbGluZ1NwZWVkIGlzIDAgdGhlcmUncyBhIGxpdHRsZSBkZWxheSwgd2hpY2ggbWlnaHQgY2F1c2UgdGhlXG4gICAgICAgIC8vc2Nyb2xsaW5nU3BlZWQgdG8gY2hhbmdlIGluIGNhc2Ugb2YgdXNpbmcgc2lsZW50TW92ZVRvKCk7w6dcblxuICAgICAgICBpZiAoZ2V0T3B0aW9ucygpLnNjcm9sbGluZ1NwZWVkKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGdfYWZ0ZXJTZWN0aW9uTG9hZHNJZCk7XG4gICAgICAgICAgZ19hZnRlclNlY3Rpb25Mb2Fkc0lkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhZnRlclNlY3Rpb25Mb2FkcyQxKHYpOyAvL2Rpc2FibGluZyBjYW5TY3JvbGwgd2hlbiB1c2luZyBmYXN0U3BlZWRcblxuICAgICAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBjYW5TY3JvbGw6ICFpc0Zhc3RTcGVlZCB8fCBGUC50ZXN0LmlzVGVzdGluZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgZ2V0T3B0aW9ucygpLnNjcm9sbGluZ1NwZWVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZnRlclNlY3Rpb25Mb2FkcyQxKHYpO1xuICAgICAgICB9XG4gICAgICB9IC8vIHVzaW5nIEpTIHRvIGFuaW1hdGVcbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgc2Nyb2xsU2V0dGluZ3MgPSBnZXRTY3JvbGxTZXR0aW5ncyh2LmR0b3ApO1xuICAgICAgICBGUC50ZXN0LnRvcCA9IC12LmR0b3AgKyAncHgnO1xuICAgICAgICBjbGVhclRpbWVvdXQoZ19hZnRlclNlY3Rpb25Mb2Fkc0lkKTtcbiAgICAgICAgc2Nyb2xsVG8oc2Nyb2xsU2V0dGluZ3MuZWxlbWVudCwgc2Nyb2xsU2V0dGluZ3Mub3B0aW9ucywgZ2V0T3B0aW9ucygpLnNjcm9sbGluZ1NwZWVkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGdldE9wdGlvbnMoKS5zY3JvbGxCYXIpIHtcbiAgICAgICAgICAgIC8qIEhhY2shXG4gICAgICAgICAgICBUaGUgdGltZW91dCBwcmV2ZW50cyBzZXR0aW5nIHRoZSBtb3N0IGRvbWluYW50IHNlY3Rpb24gaW4gdGhlIHZpZXdwb3J0IGFzIFwiYWN0aXZlXCIgd2hlbiB0aGUgdXNlclxuICAgICAgICAgICAgc2Nyb2xsZWQgdG8gYSBzbWFsbGVyIHNlY3Rpb24gYnkgdXNpbmcgdGhlIG1vdXNld2hlZWwgKGF1dG8gc2Nyb2xsaW5nKSByYXRoZXIgdGhhbiBkcmFnaW5nIHRoZSBzY3JvbGwgYmFyLlxuICAgICAgICAgICAgIFdoZW4gdXNpbmcgc2Nyb2xsQmFyOnRydWUgSXQgc2VlbXMgbGlrZSB0aGUgc2Nyb2xsIGV2ZW50cyBzdGlsbCBnZXR0aW5nIHByb3BhZ2F0ZWQgZXZlbiBhZnRlciB0aGUgc2Nyb2xsaW5nIGFuaW1hdGlvbiBoYXMgZmluaXNoZWQuXG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ19hZnRlclNlY3Rpb25Mb2Fkc0lkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGFmdGVyU2VjdGlvbkxvYWRzJDEodik7XG4gICAgICAgICAgICB9LCAzMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFmdGVyU2VjdGlvbkxvYWRzJDEodik7IC8vZGlzYWJsaW5nIGNhblNjcm9sbCB3aGVuIHVzaW5nIGZhc3RTcGVlZFxuXG4gICAgICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGNhblNjcm9sbDogIWlzRmFzdFNwZWVkIHx8IEZQLnRlc3QuaXNUZXN0aW5nXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSAvLyBlbmFibGluZyBjYW5TY3JvbGwgYWZ0ZXIgdGhlIG1pbmltdW0gdHJhbnNpdGlvbiBsYXBzXG5cblxuICAgICAgaWYgKGlzRmFzdFNwZWVkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChnX3RyYW5zaXRpb25MYXBzZUlkKTtcbiAgICAgICAgZ190cmFuc2l0aW9uTGFwc2VJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgIGNhblNjcm9sbDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCB0cmFuc2l0aW9uTGFwc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAqIEFjdGlvbnMgdG8gZG8gb25jZSB0aGUgc2VjdGlvbiBpcyBsb2FkZWQuXG4gICAgKi9cblxuXG4gICAgZnVuY3Rpb24gYWZ0ZXJTZWN0aW9uTG9hZHMkMSh2KSB7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGlzQmV5b25kRnVsbHBhZ2U6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVvdXNWZXJ0aWNhbEZpeFNlY3Rpb25PcmRlcih2KTsgLy9jYWxsYmFjayAoYWZ0ZXJMb2FkKSBpZiB0aGUgc2l0ZSBpcyBub3QganVzdCByZXNpemluZyBhbmQgcmVhZGp1c3RpbmcgdGhlIHNsaWRlc1xuXG4gICAgICBpZiAoaXNGdW5jdGlvbihnZXRPcHRpb25zKCkuYWZ0ZXJMb2FkKSAmJiAhdi5sb2NhbElzUmVzaXppbmcpIHtcbiAgICAgICAgZmlyZUNhbGxiYWNrKCdhZnRlckxvYWQnLCB2KTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlU3RhdGUoKTtcblxuICAgICAgaWYgKCF2LmxvY2FsSXNSZXNpemluZykge1xuICAgICAgICBwbGF5TWVkaWEodi5lbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYWRkQ2xhc3Modi5lbGVtZW50LCBDT01QTEVURUxZKTtcbiAgICAgIHJlbW92ZUNsYXNzKHNpYmxpbmdzKHYuZWxlbWVudCksIENPTVBMRVRFTFkpO1xuICAgICAgbGF6eUxvYWRPdGhlcnMoKTtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgY2FuU2Nyb2xsOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50cy5hZnRlclNlY3Rpb25Mb2Fkcywgdik7XG5cbiAgICAgIGlmIChpc0Z1bmN0aW9uKHYuY2FsbGJhY2spKSB7XG4gICAgICAgIHYuY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBGUC5zZXRGaXRUb1NlY3Rpb24gPSBzZXRGaXRUb1NlY3Rpb247XG4gICAgRlAuZml0VG9TZWN0aW9uID0gZml0VG9TZWN0aW9uO1xuICAgIC8qKlxuICAgICogU2V0cyBmaXRUb1NlY3Rpb25cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gc2V0Rml0VG9TZWN0aW9uKHZhbHVlLCB0eXBlKSB7XG4gICAgICBzZXRWYXJpYWJsZVN0YXRlKCdmaXRUb1NlY3Rpb24nLCB2YWx1ZSwgdHlwZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICogRml0cyB0aGUgc2l0ZSB0byB0aGUgbmVhcmVzdCBhY3RpdmUgc2VjdGlvblxuICAgICovXG5cbiAgICBmdW5jdGlvbiBmaXRUb1NlY3Rpb24oKSB7XG4gICAgICAvL2NoZWNraW5nIGZpdFRvU2VjdGlvbiBhZ2FpbiBpbiBjYXNlIGl0IHdhcyBzZXQgdG8gZmFsc2UgYmVmb3JlIHRoZSB0aW1lb3V0IGRlbGF5XG4gICAgICBpZiAoc3RhdGUuY2FuU2Nyb2xsKSB7XG4gICAgICAgIC8vYWxsb3dzIHRvIHNjcm9sbCB0byBhbiBhY3RpdmUgc2VjdGlvbiBhbmRcbiAgICAgICAgLy9pZiB0aGUgc2VjdGlvbiBpcyBhbHJlYWR5IGFjdGl2ZSwgd2UgcHJldmVudCBmaXJpbmcgY2FsbGJhY2tzXG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBpc1Jlc2l6aW5nOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBzY3JvbGxQYWdlKHN0YXRlLmFjdGl2ZVNlY3Rpb24pO1xuICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgaXNSZXNpemluZzogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgRlAuc2V0UmVzcG9uc2l2ZSA9IHNldFJlc3BvbnNpdmU7XG4gICAgLyoqXG4gICAgKiBDaGVja3MgaWYgdGhlIHNpdGUgbmVlZHMgdG8gZ2V0IHJlc3BvbnNpdmUgYW5kIGRpc2FibGVzIGF1dG9TY3JvbGxpbmcgaWYgc28uXG4gICAgKiBBIGNsYXNzIGBmcC1yZXNwb25zaXZlYCBpcyBhZGRlZCB0byB0aGUgcGx1Z2luJ3MgY29udGFpbmVyIGluIGNhc2UgdGhlIHVzZXIgd2FudHMgdG8gdXNlIGl0IGZvciBoaXMgb3duIHJlc3BvbnNpdmUgQ1NTLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiByZXNwb25zaXZlKCkge1xuICAgICAgdmFyIHdpZHRoTGltaXQgPSBnZXRPcHRpb25zKCkucmVzcG9uc2l2ZSB8fCBnZXRPcHRpb25zKCkucmVzcG9uc2l2ZVdpZHRoOyAvL2JhY2t3YXJkcyBjb21wYXRpYmxpdHlcblxuICAgICAgdmFyIGhlaWdodExpbWl0ID0gZ2V0T3B0aW9ucygpLnJlc3BvbnNpdmVIZWlnaHQ7IC8vb25seSBjYWxjdWxhdGluZyB3aGF0IHdlIG5lZWQuIFJlbWVtYmVyIGl0cyBjYWxsZWQgb24gdGhlIHJlc2l6ZSBldmVudC5cblxuICAgICAgdmFyIGlzQnJlYWtpbmdQb2ludFdpZHRoID0gd2lkdGhMaW1pdCAmJiB3aW4uaW5uZXJXaWR0aCA8IHdpZHRoTGltaXQ7XG4gICAgICB2YXIgaXNCcmVha2luZ1BvaW50SGVpZ2h0ID0gaGVpZ2h0TGltaXQgJiYgd2luLmlubmVySGVpZ2h0IDwgaGVpZ2h0TGltaXQ7XG5cbiAgICAgIGlmICh3aWR0aExpbWl0ICYmIGhlaWdodExpbWl0KSB7XG4gICAgICAgIHNldFJlc3BvbnNpdmUoaXNCcmVha2luZ1BvaW50V2lkdGggfHwgaXNCcmVha2luZ1BvaW50SGVpZ2h0KTtcbiAgICAgIH0gZWxzZSBpZiAod2lkdGhMaW1pdCkge1xuICAgICAgICBzZXRSZXNwb25zaXZlKGlzQnJlYWtpbmdQb2ludFdpZHRoKTtcbiAgICAgIH0gZWxzZSBpZiAoaGVpZ2h0TGltaXQpIHtcbiAgICAgICAgc2V0UmVzcG9uc2l2ZShpc0JyZWFraW5nUG9pbnRIZWlnaHQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAqIFR1cm5zIGZ1bGxQYWdlLmpzIHRvIG5vcm1hbCBzY3JvbGxpbmcgbW9kZSB3aGVuIHRoZSB2aWV3cG9ydCBgd2lkdGhgIG9yIGBoZWlnaHRgXG4gICAgKiBhcmUgc21hbGxlciB0aGFuIHRoZSBzZXQgbGltaXQgdmFsdWVzLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBzZXRSZXNwb25zaXZlKGFjdGl2ZSkge1xuICAgICAgdmFyIGlzUmVzcG9uc2l2ZSA9IGlzUmVzcG9uc2l2ZU1vZGUoKTtcblxuICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICBpZiAoIWlzUmVzcG9uc2l2ZSkge1xuICAgICAgICAgIHNldEF1dG9TY3JvbGxpbmcoZmFsc2UsICdpbnRlcm5hbCcpO1xuICAgICAgICAgIHNldEZpdFRvU2VjdGlvbihmYWxzZSwgJ2ludGVybmFsJyk7XG4gICAgICAgICAgaGlkZSgkKFNFQ1RJT05fTkFWX1NFTCkpO1xuICAgICAgICAgIGFkZENsYXNzKCRib2R5LCBSRVNQT05TSVZFKTtcblxuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGdldE9wdGlvbnMoKS5hZnRlclJlc3BvbnNpdmUpKSB7XG4gICAgICAgICAgICBnZXRPcHRpb25zKCkuYWZ0ZXJSZXNwb25zaXZlLmNhbGwoZ2V0Q29udGFpbmVyKCksIGFjdGl2ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzUmVzcG9uc2l2ZSkge1xuICAgICAgICBzZXRBdXRvU2Nyb2xsaW5nKGdldE9yaWdpbmFscygpLmF1dG9TY3JvbGxpbmcsICdpbnRlcm5hbCcpO1xuICAgICAgICBzZXRGaXRUb1NlY3Rpb24oZ2V0T3JpZ2luYWxzKCkuYXV0b1Njcm9sbGluZywgJ2ludGVybmFsJyk7XG4gICAgICAgIHNob3coJChTRUNUSU9OX05BVl9TRUwpKTtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoJGJvZHksIFJFU1BPTlNJVkUpO1xuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGdldE9wdGlvbnMoKS5hZnRlclJlc3BvbnNpdmUpKSB7XG4gICAgICAgICAgZ2V0T3B0aW9ucygpLmFmdGVyUmVzcG9uc2l2ZS5jYWxsKGdldENvbnRhaW5lcigpLCBhY3RpdmUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGZ1bGxwYWdlLmpzIGlzIGluIHJlc3BvbnNpdmUgbW9kZSBvciBub3QuXG4gICAgKi9cblxuXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zaXZlTW9kZSgpIHtcbiAgICAgIHJldHVybiBoYXNDbGFzcygkYm9keSwgUkVTUE9OU0lWRSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkVGFibGVDbGFzcyhlbGVtZW50KSB7XG4gICAgICBpZiAoIWdldE9wdGlvbnMoKS52ZXJ0aWNhbENlbnRlcmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gT3ZlcmZsb3dpbmcgc2VjdGlvbnMgd2hlbiBzY3JvbGxPdmVyZmxvdyBpcyBkaXNhYmxlZCB3aWxsIGJlIGF1dG9IZWlnaHRcbiAgICAgIC8vIGFuZCB3b24ndCByZXF1aXJlIHZlcnRpY2FsIGFsaWdtZW50XG5cblxuICAgICAgaWYgKCFnZXRPcHRpb25zKCkuc2Nyb2xsT3ZlcmZsb3cgJiYgc2Nyb2xsT3ZlcmZsb3dIYW5kbGVyLnNob3VsZEJlU2Nyb2xsYWJsZShlbGVtZW50Lml0ZW0pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzY3JvbGxPdmVyZmxvd0hhbmRsZXIuaXNTY3JvbGxhYmxlKGVsZW1lbnQpKSB7XG4gICAgICAgIC8vSW4gY2FzZSB3ZSBhcmUgc3R5bGluZyBmb3IgdGhlIDJuZCB0aW1lIGFzIGluIHdpdGggcmVwb25zaXZlU2xpZGVzXG4gICAgICAgIGlmICghaGFzQ2xhc3MoZWxlbWVudC5pdGVtLCBUQUJMRSkpIHtcbiAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50Lml0ZW0sIFRBQkxFKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzdGFydGluZ1NlY3Rpb24gPSBudWxsO1xuICAgIEZQLmdldEFjdGl2ZVNlY3Rpb24gPSBnZXRBY3RpdmVTZWN0aW9uO1xuICAgIGZ1bmN0aW9uIGdldFN0YXJ0aW5nU2VjdGlvbigpIHtcbiAgICAgIHJldHVybiBzdGFydGluZ1NlY3Rpb247XG4gICAgfVxuICAgIC8qKlxuICAgICogU3R5bGluZyB2ZXJ0aWNhbCBzZWN0aW9uc1xuICAgICovXG5cbiAgICBmdW5jdGlvbiBzdHlsZVNlY3Rpb24oc2VjdGlvbikge1xuICAgICAgdmFyIHNlY3Rpb25FbGVtID0gc2VjdGlvbi5pdGVtO1xuICAgICAgdmFyIGhhc1NsaWRlcyA9IHNlY3Rpb24uYWxsU2xpZGVzSXRlbXMubGVuZ3RoO1xuICAgICAgdmFyIGluZGV4ID0gc2VjdGlvbi5pbmRleCgpOyAvL2lmIG5vIGFjdGl2ZSBzZWN0aW9uIGlzIGRlZmluZWQsIHRoZSAxc3Qgb25lIHdpbGwgYmUgdGhlIGRlZmF1bHQgb25lXG5cbiAgICAgIGlmICghZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uICYmIHNlY3Rpb24uaXNWaXNpYmxlKSB7XG4gICAgICAgIGFkZENsYXNzKHNlY3Rpb25FbGVtLCBBQ1RJVkUpO1xuICAgICAgICB1cGRhdGVTdGF0ZSgpO1xuICAgICAgICBzdGFydGluZ1NlY3Rpb24gPSBnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb24uaXRlbTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldE9wdGlvbnMoKS5wYWRkaW5nVG9wKSB7XG4gICAgICAgIGNzcyhzZWN0aW9uRWxlbSwge1xuICAgICAgICAgICdwYWRkaW5nLXRvcCc6IGdldE9wdGlvbnMoKS5wYWRkaW5nVG9wXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0T3B0aW9ucygpLnBhZGRpbmdCb3R0b20pIHtcbiAgICAgICAgY3NzKHNlY3Rpb25FbGVtLCB7XG4gICAgICAgICAgJ3BhZGRpbmctYm90dG9tJzogZ2V0T3B0aW9ucygpLnBhZGRpbmdCb3R0b21cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZ2V0T3B0aW9ucygpLnNlY3Rpb25zQ29sb3JbaW5kZXhdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjc3Moc2VjdGlvbkVsZW0sIHtcbiAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IGdldE9wdGlvbnMoKS5zZWN0aW9uc0NvbG9yW2luZGV4XVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBnZXRPcHRpb25zKCkuYW5jaG9yc1tpbmRleF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNlY3Rpb25FbGVtLnNldEF0dHJpYnV0ZSgnZGF0YS1hbmNob3InLCBzZWN0aW9uLmFuY2hvcik7XG4gICAgICB9XG5cbiAgICAgIGlmICghaGFzU2xpZGVzKSB7XG4gICAgICAgIGFkZFRhYmxlQ2xhc3Moc2VjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICogR2V0cyB0aGUgYWN0aXZlIHNlY3Rpb24uXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGdldEFjdGl2ZVNlY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNlY3Rpb25Gcm9tUGFuZWwocGFuZWwpIHtcbiAgICAgIHJldHVybiBwYW5lbC5pc1NlY3Rpb24gPyBwYW5lbCA6IHBhbmVsLnBhcmVudDtcbiAgICB9XG5cbiAgICB2YXIgZ19mb2N1c1Njcm9sbGFibGVJZDtcbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRzLmJpbmRFdmVudHMsIGJpbmRFdmVudHMkYik7XG5cbiAgICBmdW5jdGlvbiBiaW5kRXZlbnRzJGIoKSB7XG4gICAgICAvLyBXZSBjYW4ndCBmb2N1cyBzY3JvbGxPdmVyZmxvdyBiZWZvcmUgc2Nyb2xsaW5nXG4gICAgICAvLyB0byB0aGUgYW5jaG9yIChpZiB3ZSBuZWVkIHRvKVxuICAgICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50cy5vbkFmdGVyUmVuZGVyTm9BbmNob3IsIGFmdGVyUmVuZGVyKTtcbiAgICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMub25MZWF2ZSwgc2Nyb2xsT3ZlcmZsb3dIYW5kbGVyLm9uTGVhdmUpO1xuICAgICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50cy5vblNsaWRlTGVhdmUsIHNjcm9sbE92ZXJmbG93SGFuZGxlci5vbkxlYXZlKTtcbiAgICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMuYWZ0ZXJTbGlkZUxvYWRzLCBzY3JvbGxPdmVyZmxvd0hhbmRsZXIuYWZ0ZXJMb2FkKTtcbiAgICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMuYWZ0ZXJTZWN0aW9uTG9hZHMsIHNjcm9sbE92ZXJmbG93SGFuZGxlci5hZnRlckxvYWQpO1xuICAgICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50cy5vbkRlc3Ryb3ksIG9uRGVzdHJveSQ3KTtcbiAgICAgIGRvY0FkZEV2ZW50KCdrZXl1cCcsIHNjcm9sbE92ZXJmbG93SGFuZGxlci5rZXlVcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFmdGVyUmVuZGVyKCkge1xuICAgICAgaWYgKGdldE9wdGlvbnMoKS5zY3JvbGxPdmVyZmxvdyAmJiAhZ2V0T3B0aW9ucygpLnNjcm9sbEJhcikge1xuICAgICAgICBzY3JvbGxPdmVyZmxvd0hhbmRsZXIubWFrZVNjcm9sbGFibGUoKTtcbiAgICAgICAgc2Nyb2xsT3ZlcmZsb3dIYW5kbGVyLmZvY3VzU2Nyb2xsYWJsZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uRGVzdHJveSQ3KCkge1xuICAgICAgRXZlbnRFbWl0dGVyLnJlbW92ZUxpc3RlbmVyKGV2ZW50cy5vbkFmdGVyUmVuZGVyTm9BbmNob3IsIGFmdGVyUmVuZGVyKTtcbiAgICAgIGRvY1JlbW92ZUV2ZW50KCdrZXl1cCcsIHNjcm9sbE92ZXJmbG93SGFuZGxlci5rZXlVcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHZhciBzY3JvbGxPdmVyZmxvd0hhbmRsZXIgPSB7XG4gICAgICBmb2N1c2VkRWxlbTogbnVsbCxcbiAgICAgIHNob3VsZEZvY3VzU2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICAgIGlzSW5uZXJTY3JvbGxBbGxvd2VkOiB0cnVlLFxuICAgICAgdGltZUJlZm9yZVJlYWNoaW5nTGltaXQ6IG51bGwsXG4gICAgICB0aW1lTGFzdFNjcm9sbDogbnVsbCxcbiAgICAgIHByZXZlbnRTY3JvbGxXaXRoTW91c2VXaGVlbDogZnVuY3Rpb24gcHJldmVudFNjcm9sbFdpdGhNb3VzZVdoZWVsKGUpIHtcbiAgICAgICAgaWYgKCFzdGF0ZS5jYW5TY3JvbGwpIHtcbiAgICAgICAgICBwcmV2ZW50RGVmYXVsdChlKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcmV2ZW50U2Nyb2xsV2l0aEtleWJvYXJkOiBmdW5jdGlvbiBwcmV2ZW50U2Nyb2xsV2l0aEtleWJvYXJkKGUpIHtcbiAgICAgICAgaWYgKCFpc0luc2lkZUlucHV0KCkgJiYgZ2V0T3B0aW9ucygpLmtleWJvYXJkU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgdmFyIGRpcmVjdGlvbktleXMgPSBbMzgsIDMzLCAzMiwgNDAsIDM0LCAzNiwgMzVdO1xuXG4gICAgICAgICAgaWYgKGRpcmVjdGlvbktleXMuaW5kZXhPZihlLmtleUNvZGUpID4gLTEgJiYgIXNjcm9sbE92ZXJmbG93SGFuZGxlci5pc0lubmVyU2Nyb2xsQWxsb3dlZCkge1xuICAgICAgICAgICAgcHJldmVudERlZmF1bHQoZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAga2V5VXBIYW5kbGVyOiBmdW5jdGlvbiBrZXlVcEhhbmRsZXIoKSB7XG4gICAgICAgIHNjcm9sbE92ZXJmbG93SGFuZGxlci5zaG91bGRGb2N1c1Njcm9sbGFibGUgPSBzdGF0ZS5jYW5TY3JvbGw7XG4gICAgICB9LFxuICAgICAgLy8gTGVhdmluZyBzZWN0aW9ucyBvciBzbGlkZXNcbiAgICAgIG9uTGVhdmU6IGZ1bmN0aW9uIG9uTGVhdmUoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChnX2ZvY3VzU2Nyb2xsYWJsZUlkKTtcbiAgICAgICAgc2Nyb2xsT3ZlcmZsb3dIYW5kbGVyLmlzSW5uZXJTY3JvbGxBbGxvd2VkID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgLy8gTG9hZGluZyBzZWN0aW9ucyBvciBzbGlkZXNcbiAgICAgIGFmdGVyTG9hZDogZnVuY3Rpb24gYWZ0ZXJMb2FkKCkge1xuICAgICAgICBzY3JvbGxPdmVyZmxvd0hhbmRsZXIuaXNJbm5lclNjcm9sbEFsbG93ZWQgPSBmYWxzZTsgLy8gRGVsYXlpbmcgaXQgdG8gYXZvaWQgaXNzdWVzIG9uIFNhZmFyaSB3aGVuIGZvY3VzaW5nIGVsZW1lbnRzICM0NDg0ICYgIzQ0OTNcblxuICAgICAgICBjbGVhclRpbWVvdXQoZ19mb2N1c1Njcm9sbGFibGVJZCk7XG4gICAgICAgIGdfZm9jdXNTY3JvbGxhYmxlSWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzY3JvbGxPdmVyZmxvd0hhbmRsZXIuc2hvdWxkRm9jdXNTY3JvbGxhYmxlID0gc3RhdGUuY2FuU2Nyb2xsO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgfSxcbiAgICAgIC8vIFVuZm9jdXNpbmcgdGhlIHNjcm9sbGFibGUgZWxlbWVudCBmcm9tIHRoZSBvcmdpbiBzZWN0aW9uL3NsaWRlXG4gICAgICB1bmZvY3VzU2Nyb2xsYWJsZTogZnVuY3Rpb24gdW5mb2N1c1Njcm9sbGFibGUoKSB7XG4gICAgICAgIGlmIChkb2MuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5mb2N1c2VkRWxlbSkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICB0aGlzLmZvY3VzZWRFbGVtLmJsdXIoKTtcbiAgICAgICAgICBzY3JvbGxPdmVyZmxvd0hhbmRsZXIuaXNJbm5lclNjcm9sbEFsbG93ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZvY3VzU2Nyb2xsYWJsZTogZnVuY3Rpb24gZm9jdXNTY3JvbGxhYmxlKCkge1xuICAgICAgICBpZiAoIWdldE9wdGlvbnMoKS5zY3JvbGxPdmVyZmxvdyB8fCAhc2Nyb2xsT3ZlcmZsb3dIYW5kbGVyLnNob3VsZEZvY3VzU2Nyb2xsYWJsZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNjcm9sbE92ZXJmbG93SGFuZGxlci51bmZvY3VzU2Nyb2xsYWJsZSgpO1xuICAgICAgICB2YXIgc2Nyb2xsYWJsZUl0ZW0gPSBzY3JvbGxPdmVyZmxvd0hhbmRsZXIuZ2V0U2Nyb2xsYWJsZUl0ZW0oZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uLml0ZW0pOyAvLyBPbiBkZXNrdG9wIHdlIGZvY3VzIHRoZSBzY3JvbGxhYmxlIHRvIGJlIGFibGUgdG8gdXNlIHRoZSBtb3VzZSB3aGVlbFxuICAgICAgICAvLyBXZSBhdm9pZCBpdCBvbiBtb2JpbGUgZHVlIHRvIGEgYnVnIGluIGlPUyBTYWZhcmlcblxuICAgICAgICBpZiAoc2Nyb2xsYWJsZUl0ZW0gJiYgIWlzVG91Y2hEZXZpY2UgJiYgIWlzVG91Y2gpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRFbGVtID0gc2Nyb2xsYWJsZUl0ZW07IC8vIEZvcmNpbmcgdGhlIGZvY3VzIG9uIHRoZSBuZXh0IHBhaW50IFxuICAgICAgICAgIC8vIHRvIGF2b2lkIGlzc3VlICM0NDg0ICYgIzQ0OTMgb24gU2FmYXJpXG5cbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2Nyb2xsYWJsZUl0ZW0uZm9jdXMoKTtcbiAgICAgICAgICAgIHNjcm9sbE92ZXJmbG93SGFuZGxlci5pc0lubmVyU2Nyb2xsQWxsb3dlZCA9IHRydWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBzY3JvbGxPdmVyZmxvd0hhbmRsZXIuc2hvdWxkRm9jdXNTY3JvbGxhYmxlID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgbWFrZVNjcm9sbGFibGU6IGZ1bmN0aW9uIG1ha2VTY3JvbGxhYmxlKCkge1xuICAgICAgICBpZiAoZ2V0T3B0aW9ucygpLnNjcm9sbE92ZXJmbG93TWFjU3R5bGUgJiYgIWlzTWFjRGV2aWNlKSB7XG4gICAgICAgICAgYWRkQ2xhc3MoJGJvZHksICdmcC1zY3JvbGwtbWFjJyk7XG4gICAgICAgIH1cblxuICAgICAgICBnZXRTdGF0ZSgpLnBhbmVscy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIGlmIChlbC5zbGlkZXMgJiYgZWwuc2xpZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNDbGFzcyhlbC5pdGVtLCBBVVRPX0hFSUdIVF9SRVNQT05TSVZFKSAmJiBpc1Jlc3BvbnNpdmVNb2RlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBnZXRTbGlkZU9yU2VjdGlvbihlbC5pdGVtKTtcbiAgICAgICAgICAgIHZhciBzaG91bGRCZVNjcm9sbGFibGUgPSBzY3JvbGxPdmVyZmxvd0hhbmRsZXIuc2hvdWxkQmVTY3JvbGxhYmxlKGVsLml0ZW0pO1xuICAgICAgICAgICAgdmFyIHNlY3Rpb24gPSBnZXRTZWN0aW9uRnJvbVBhbmVsKGVsKTtcblxuICAgICAgICAgICAgaWYgKGlzSUUxMSkge1xuICAgICAgICAgICAgICB2YXIgdG9nZ2xlQWN0aW9uID0gc2hvdWxkQmVTY3JvbGxhYmxlID8gJ2FkZENsYXNzJyA6ICdyZW1vdmVDbGFzcyc7XG4gICAgICAgICAgICAgIHV0aWxzW3RvZ2dsZUFjdGlvbl0oc2VjdGlvbi5pdGVtLCBJU19PVkVSRkxPVyk7XG4gICAgICAgICAgICAgIHV0aWxzW3RvZ2dsZUFjdGlvbl0oZWwuaXRlbSwgSVNfT1ZFUkZMT1cpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3Moc2VjdGlvbi5pdGVtLCBJU19PVkVSRkxPVyk7XG4gICAgICAgICAgICAgIGFkZENsYXNzKGVsLml0ZW0sIElTX09WRVJGTE9XKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFlbC5oYXNTY3JvbGwpIHtcbiAgICAgICAgICAgICAgc2Nyb2xsT3ZlcmZsb3dIYW5kbGVyLmNyZWF0ZVdyYXBwZXIoaXRlbSk7XG4gICAgICAgICAgICAgIHNjcm9sbE92ZXJmbG93SGFuZGxlci5iaW5kRXZlbnRzKGl0ZW0pO1xuICAgICAgICAgICAgfSAvLyB1cGRhdGluZyB0aGUgc3RhdGUgbm93IGluIGNhc2UgXG4gICAgICAgICAgICAvLyB0aGlzIGlzIGV4ZWN1dGVkIG9uIHBhZ2UgbG9hZCAoYWZ0ZXIgaW1hZ2VzIGxvYWQpXG5cblxuICAgICAgICAgICAgZWwuaGFzU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGJpbmRFdmVudHM6IGZ1bmN0aW9uIGJpbmRFdmVudHMoaXRlbSkge1xuICAgICAgICBzY3JvbGxPdmVyZmxvd0hhbmRsZXIuZ2V0U2Nyb2xsYWJsZUl0ZW0oaXRlbSkuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsT3ZlcmZsb3dIYW5kbGVyLm9uUGFuZWxTY3JvbGwpO1xuICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgc2Nyb2xsT3ZlcmZsb3dIYW5kbGVyLnByZXZlbnRTY3JvbGxXaXRoTW91c2VXaGVlbCwge1xuICAgICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBzY3JvbGxPdmVyZmxvd0hhbmRsZXIucHJldmVudFNjcm9sbFdpdGhLZXlib2FyZCwge1xuICAgICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGNyZWF0ZVdyYXBwZXI6IGZ1bmN0aW9uIGNyZWF0ZVdyYXBwZXIoaXRlbSkge1xuICAgICAgICB2YXIgb3ZlcmZsb3dXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIG92ZXJmbG93V3JhcHBlci5jbGFzc05hbWUgPSBPVkVSRkxPVztcbiAgICAgICAgd3JhcElubmVyKGl0ZW0sIG92ZXJmbG93V3JhcHBlcik7XG4gICAgICAgIG92ZXJmbG93V3JhcHBlci5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgICB9LFxuICAgICAgZGVzdHJveVdyYXBwZXI6IGZ1bmN0aW9uIGRlc3Ryb3lXcmFwcGVyKGl0ZW0pIHtcbiAgICAgICAgdmFyIG92ZXJmbG93V3JhcHBlciA9ICQoT1ZFUkZMT1dfU0VMLCBpdGVtKVswXTtcblxuICAgICAgICBpZiAob3ZlcmZsb3dXcmFwcGVyKSB7XG4gICAgICAgICAgdW53cmFwKG92ZXJmbG93V3JhcHBlcik7XG4gICAgICAgICAgaXRlbS5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRTY3JvbGxhYmxlSXRlbTogZnVuY3Rpb24gZ2V0U2Nyb2xsYWJsZUl0ZW0oc2VjdGlvbkl0ZW0pIHtcbiAgICAgICAgdmFyIHBhbmVsID0gZ2V0U2xpZGVPclNlY3Rpb24oc2VjdGlvbkl0ZW0pO1xuICAgICAgICByZXR1cm4gJChPVkVSRkxPV19TRUwsIHBhbmVsKVswXSB8fCBwYW5lbDtcbiAgICAgIH0sXG4gICAgICBoYXNTY3JvbGw6IGZ1bmN0aW9uIGhhc1Njcm9sbChwYW5lbEl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGhhc0NsYXNzKHBhbmVsSXRlbSwgT1ZFUkZMT1cpIHx8ICQoT1ZFUkZMT1dfU0VMLCBwYW5lbEl0ZW0pWzBdICE9IG51bGw7XG4gICAgICB9LFxuICAgICAgaXNTY3JvbGxhYmxlOiBmdW5jdGlvbiBpc1Njcm9sbGFibGUocGFuZWwpIHtcbiAgICAgICAgcmV0dXJuIHBhbmVsLmlzU2VjdGlvbiAmJiBwYW5lbC5hY3RpdmVTbGlkZSA/IHBhbmVsLmFjdGl2ZVNsaWRlLmhhc1Njcm9sbCA6IHBhbmVsLmhhc1Njcm9sbDtcbiAgICAgIH0sXG4gICAgICBzaG91bGRCZVNjcm9sbGFibGU6IGZ1bmN0aW9uIHNob3VsZEJlU2Nyb2xsYWJsZShpdGVtKSB7XG4gICAgICAgIHZhciBzY3JvbGxhYmxlID0gc2Nyb2xsT3ZlcmZsb3dIYW5kbGVyLmdldFNjcm9sbGFibGVJdGVtKGl0ZW0pO1xuICAgICAgICByZXR1cm4gc2Nyb2xsYWJsZS5zY3JvbGxIZWlnaHQgPiB3aW4uaW5uZXJIZWlnaHQ7XG4gICAgICB9LFxuICAgICAgaXNTY3JvbGxlZDogZnVuY3Rpb24gaXNTY3JvbGxlZChkaXJlY3Rpb24sIGVsKSB7XG4gICAgICAgIGlmICghc3RhdGUuY2FuU2Nyb2xsKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IC8vIHdlIHdvbid0IGFsbG93IHNjcm9sbG92ZXJmbG93IG9uIHNjcm9sbEJhcjp0cnVlXG5cblxuICAgICAgICBpZiAoZ2V0T3B0aW9ucygpLnNjcm9sbEJhcikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNjcm9sbGFibGVJdGVtID0gc2Nyb2xsT3ZlcmZsb3dIYW5kbGVyLmdldFNjcm9sbGFibGVJdGVtKGVsKTtcblxuICAgICAgICBpZiAoIWdldE9wdGlvbnMoKS5zY3JvbGxPdmVyZmxvdyB8fCAhaGFzQ2xhc3Moc2Nyb2xsYWJsZUl0ZW0sIE9WRVJGTE9XKSB8fCAvLyBDaGVja2luZyB0aGUgc2VjdGlvbiBmaXJzdCBcbiAgICAgICAgLy8gSW4gY2FzZSB0aGV5IGFwcGx5IHRvIGJvdGggc2VjdGlvbiArIHNsaWRlICM0NTA1XG4gICAgICAgIGhhc0NsYXNzKGVsLCAnZnAtbm9zY3JvbGwnKSB8fCAvLyBDaGVja2luZyB0aGUgc2xpZGUgKGluIGNhc2UgaXQgaGFzKVxuICAgICAgICBoYXNDbGFzcyhnZXRTbGlkZU9yU2VjdGlvbihlbCksICdmcC1ub3Njcm9sbCcpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gLy8gaWUxMSB3cm9uZ2x5IGNhbGN1bGF0ZXMgc2Nyb2xsSGVpZ2h0IHdoZW4gdXNpbmcgdGhlIENTUyBzdHlsZVxuICAgICAgICAvLyBvdmVyZmxvdzogYXV0byAgIEl0IGFkZHMgMSBtb3JlIHBpeGVsIGNvbXBhcmVkIHRvIG9mZnNldEhlaWdodFxuXG5cbiAgICAgICAgdmFyIGllMTFvZmZzZXQgPSBpc0lFMTEgPyAxIDogMDtcbiAgICAgICAgdmFyIHBvc2l0aW9uWSA9IHNjcm9sbGFibGVJdGVtLnNjcm9sbFRvcDtcbiAgICAgICAgdmFyIGlzVG9wUmVhY2hlZCA9IGRpcmVjdGlvbiA9PT0gJ3VwJyAmJiBwb3NpdGlvblkgPD0gMDtcbiAgICAgICAgdmFyIGlzQm90dG9tUmVhY2hlZCA9IGRpcmVjdGlvbiA9PT0gJ2Rvd24nICYmIHNjcm9sbGFibGVJdGVtLnNjcm9sbEhlaWdodCA8PSBNYXRoLmNlaWwoc2Nyb2xsYWJsZUl0ZW0ub2Zmc2V0SGVpZ2h0ICsgcG9zaXRpb25ZKSArIGllMTFvZmZzZXQ7XG4gICAgICAgIHZhciBpc1Njcm9sbGVkID0gaXNUb3BSZWFjaGVkIHx8IGlzQm90dG9tUmVhY2hlZDtcblxuICAgICAgICBpZiAoIWlzU2Nyb2xsZWQpIHtcbiAgICAgICAgICB0aGlzLnRpbWVCZWZvcmVSZWFjaGluZ0xpbWl0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNTY3JvbGxlZDtcbiAgICAgIH0sXG4gICAgICBzaG91bGRNb3ZlUGFnZTogZnVuY3Rpb24gc2hvdWxkTW92ZVBhZ2UoKSB7XG4gICAgICAgIHRoaXMudGltZUxhc3RTY3JvbGwgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdmFyIHRpbWVEaWZmID0gdGhpcy50aW1lTGFzdFNjcm9sbCAtIHNjcm9sbE92ZXJmbG93SGFuZGxlci50aW1lQmVmb3JlUmVhY2hpbmdMaW1pdDtcbiAgICAgICAgdmFyIGlzVXNpbmdUb3VjaCA9IGlzVG91Y2hEZXZpY2UgfHwgaXNUb3VjaDtcbiAgICAgICAgdmFyIGlzR3JhYmJpbmcgPSBpc1VzaW5nVG91Y2ggJiYgc3RhdGUuaXNHcmFiYmluZztcbiAgICAgICAgdmFyIGlzTm90Rmlyc3RUaW1lUmVhY2hpbmdMaW1pdCA9IHN0YXRlLmlzVXNpbmdXaGVlbCAmJiB0aW1lRGlmZiA+IDYwMDtcbiAgICAgICAgcmV0dXJuIGlzR3JhYmJpbmcgJiYgdGltZURpZmYgPiA0MDAgfHwgaXNOb3RGaXJzdFRpbWVSZWFjaGluZ0xpbWl0O1xuICAgICAgfSxcbiAgICAgIG9uUGFuZWxTY3JvbGw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHByZXZQb3NpdGlvbiA9IDA7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHZhciBjdXJyZW50UG9zaXRpb24gPSBlLnRhcmdldC5zY3JvbGxUb3A7XG4gICAgICAgICAgdmFyIGRpcmVjdGlvbiA9IHN0YXRlLnRvdWNoRGlyZWN0aW9uICE9PSAnbm9uZScgPyBzdGF0ZS50b3VjaERpcmVjdGlvbiA6IHByZXZQb3NpdGlvbiA8IGN1cnJlbnRQb3NpdGlvbiA/ICdkb3duJyA6ICd1cCc7XG4gICAgICAgICAgcHJldlBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uO1xuXG4gICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZ2V0T3B0aW9ucygpLm9uU2Nyb2xsT3ZlcmZsb3cpKSB7XG4gICAgICAgICAgICBmaXJlQ2FsbGJhY2soJ29uU2Nyb2xsT3ZlcmZsb3cnLCB7XG4gICAgICAgICAgICAgIHBvc2l0aW9uOiBjdXJyZW50UG9zaXRpb24sXG4gICAgICAgICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzQ2xhc3MoZS50YXJnZXQsIE9WRVJGTE9XKSAmJiBzdGF0ZS5jYW5TY3JvbGwpIHtcbiAgICAgICAgICAgIGlmIChzY3JvbGxPdmVyZmxvd0hhbmRsZXIuaXNTY3JvbGxlZChkaXJlY3Rpb24sIGUudGFyZ2V0KSAmJiBzY3JvbGxPdmVyZmxvd0hhbmRsZXIuc2hvdWxkTW92ZVBhZ2UoKSkge1xuICAgICAgICAgICAgICAvLyBDaGVja2luZyBhZ2FpbiBpZiB3ZSBoYXZlIGEgc2Nyb2xsYWJsZSBjb250ZW50XG4gICAgICAgICAgICAgIC8vIFRvIGF2b2lkIGlzc3VlcyBsaWtlICM0NDc5IHdoZXJlIHRoZSBzY3JvbGwgZXZlbnQgZ2V0c1xuICAgICAgICAgICAgICAvLyB0cmlnZ2VyZWQgYWZ0ZXIgcmVtb3ZpbmcvaGlkZGluZyBjb250ZW50IGlmIHRoaXMgd2FzIHNjcm9sbGVkXG4gICAgICAgICAgICAgIGlmIChzY3JvbGxPdmVyZmxvd0hhbmRsZXIuc2hvdWxkQmVTY3JvbGxhYmxlKGdldFN0YXRlKCkuYWN0aXZlU2VjdGlvbi5pdGVtKSkge1xuICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50cy5vblNjcm9sbE92ZXJmbG93U2Nyb2xsZWQsIHtcbiAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KClcbiAgICB9O1xuXG4gICAgdmFyIGdfYWZ0ZXJTbGlkZUxvYWRzSWQ7XG4gICAgRlAubGFuZHNjYXBlU2Nyb2xsID0gbGFuZHNjYXBlU2Nyb2xsO1xuICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMuYmluZEV2ZW50cywgYmluZEV2ZW50cyRhKTtcblxuICAgIGZ1bmN0aW9uIGJpbmRFdmVudHMkYSgpIHtcbiAgICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMub25QZXJmb3JtTW92ZW1lbnQsIG9uUGVyZm9ybU1vdmVtZW50KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblBlcmZvcm1Nb3ZlbWVudCgpIHtcbiAgICAgIGNsZWFyVGltZW91dChnX2FmdGVyU2xpZGVMb2Fkc0lkKTtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgc2xpZGVNb3Zpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBTY3JvbGxzIGhvcml6b250YWwgc2xpZGVycy5cbiAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBsYW5kc2NhcGVTY3JvbGwoc2xpZGVzLCBkZXN0aW55LCBkaXJlY3Rpb24pIHtcbiAgICAgIHZhciBzZWN0aW9uRWxlbSA9IGNsb3Nlc3Qoc2xpZGVzLCBTRUNUSU9OX1NFTCk7XG4gICAgICB2YXIgc2VjdGlvbiA9IGdldFN0YXRlKCkuc2VjdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChzZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBzZWN0aW9uLml0ZW0gPT0gc2VjdGlvbkVsZW07XG4gICAgICB9KVswXTtcbiAgICAgIHZhciBzbGlkZSA9IHNlY3Rpb24uc2xpZGVzLmZpbHRlcihmdW5jdGlvbiAoc2xpZGUpIHtcbiAgICAgICAgcmV0dXJuIHNsaWRlLml0ZW0gPT0gZGVzdGlueTtcbiAgICAgIH0pWzBdO1xuICAgICAgdmFyIHYgPSB7XG4gICAgICAgIFwic2xpZGVzXCI6IHNsaWRlcyxcbiAgICAgICAgXCJkZXN0aW55XCI6IGRlc3RpbnksXG4gICAgICAgIFwiZGlyZWN0aW9uXCI6IGRpcmVjdGlvbixcbiAgICAgICAgXCJkZXN0aW55UG9zXCI6IHtcbiAgICAgICAgICBcImxlZnRcIjogZGVzdGlueS5vZmZzZXRMZWZ0XG4gICAgICAgIH0sXG4gICAgICAgIFwic2xpZGVJbmRleFwiOiBzbGlkZS5pbmRleCgpLFxuICAgICAgICBcInNlY3Rpb25cIjogc2VjdGlvbkVsZW0sXG4gICAgICAgIFwic2VjdGlvbkluZGV4XCI6IHNlY3Rpb24uaW5kZXgoKSxcbiAgICAgICAgXCJhbmNob3JMaW5rXCI6IHNlY3Rpb24uYW5jaG9yLFxuICAgICAgICBcInNsaWRlc05hdlwiOiAkKFNMSURFU19OQVZfU0VMLCBzZWN0aW9uRWxlbSlbMF0sXG4gICAgICAgIFwic2xpZGVBbmNob3JcIjogc2xpZGUuYW5jaG9yLFxuICAgICAgICBcInByZXZTbGlkZVwiOiBzZWN0aW9uLmFjdGl2ZVNsaWRlLml0ZW0sXG4gICAgICAgIFwicHJldlNsaWRlSW5kZXhcIjogc2VjdGlvbi5hY3RpdmVTbGlkZS5pbmRleCgpLFxuICAgICAgICBcIml0ZW1zXCI6IHtcbiAgICAgICAgICBcInNlY3Rpb25cIjogc2VjdGlvbixcbiAgICAgICAgICBcIm9yaWdpblwiOiBzZWN0aW9uLmFjdGl2ZVNsaWRlLFxuICAgICAgICAgIFwiZGVzdGluYXRpb25cIjogc2xpZGVcbiAgICAgICAgfSxcbiAgICAgICAgLy9jYWNoaW5nIHRoZSB2YWx1ZSBvZiBpc1Jlc2l6aW5nIGF0IHRoZSBtb21tZW50IHRoZSBmdW5jdGlvbiBpcyBjYWxsZWRcbiAgICAgICAgLy9iZWNhdXNlIGl0IHdpbGwgYmUgY2hlY2tlZCBsYXRlciBpbnNpZGUgYSBzZXRUaW1lb3V0IGFuZCB0aGUgdmFsdWUgbWlnaHQgY2hhbmdlXG4gICAgICAgIFwibG9jYWxJc1Jlc2l6aW5nXCI6IHN0YXRlLmlzUmVzaXppbmdcbiAgICAgIH07XG4gICAgICB2LnhNb3ZlbWVudCA9IGdldFhtb3ZlbWVudCh2LnByZXZTbGlkZUluZGV4LCB2LnNsaWRlSW5kZXgpO1xuICAgICAgdi5kaXJlY3Rpb24gPSB2LmRpcmVjdGlvbiA/IHYuZGlyZWN0aW9uIDogdi54TW92ZW1lbnQ7IC8vaW1wb3J0YW50ISEgT25seSBkbyBpdCB3aGVuIG5vdCByZXNpemluZ1xuXG4gICAgICBpZiAoIXYubG9jYWxJc1Jlc2l6aW5nKSB7XG4gICAgICAgIC8vcHJldmVudGluZyBmcm9tIHNjcm9sbGluZyB0byB0aGUgbmV4dC9wcmV2IHNlY3Rpb24gd2hlbiB1c2luZyBzY3JvbGxIb3Jpem9udGFsbHlcbiAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgIGNhblNjcm9sbDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRPcHRpb25zKCkub25TbGlkZUxlYXZlKSB7XG4gICAgICAgIC8vaWYgdGhlIHNpdGUgaXMgbm90IGp1c3QgcmVzaXppbmcgYW5kIHJlYWRqdXN0aW5nIHRoZSBzbGlkZXNcbiAgICAgICAgaWYgKCF2LmxvY2FsSXNSZXNpemluZyAmJiB2LnhNb3ZlbWVudCAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZ2V0T3B0aW9ucygpLm9uU2xpZGVMZWF2ZSkpIHtcbiAgICAgICAgICAgIGlmIChmaXJlQ2FsbGJhY2soJ29uU2xpZGVMZWF2ZScsIHYpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgc2xpZGVNb3Zpbmc6IGZhbHNlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFkZENsYXNzKGRlc3RpbnksIEFDVElWRSk7XG4gICAgICByZW1vdmVDbGFzcyhzaWJsaW5ncyhkZXN0aW55KSwgQUNUSVZFKTtcbiAgICAgIHVwZGF0ZVN0YXRlKCk7XG5cbiAgICAgIGlmICghdi5sb2NhbElzUmVzaXppbmcpIHtcbiAgICAgICAgc3RvcE1lZGlhKHYucHJldlNsaWRlKTtcbiAgICAgICAgbGF6eUxvYWQoZGVzdGlueSk7XG4gICAgICB9XG5cbiAgICAgIHRvZ2dsZUNvbnRyb2xBcnJvd3Modik7IC8vb25seSBjaGFuZ2luZyB0aGUgVVJMIGlmIHRoZSBzbGlkZXMgYXJlIGluIHRoZSBjdXJyZW50IHNlY3Rpb24gKG5vdCBmb3IgcmVzaXplIHJlLWFkanVzdGluZylcblxuICAgICAgaWYgKHNlY3Rpb24uaXNBY3RpdmUgJiYgIXYubG9jYWxJc1Jlc2l6aW5nKSB7XG4gICAgICAgIHNldFBhZ2VTdGF0dXModi5zbGlkZUluZGV4LCB2LnNsaWRlQW5jaG9yLCB2LmFuY2hvckxpbmspO1xuICAgICAgfVxuXG4gICAgICBFdmVudEVtaXR0ZXIuZW1pdChldmVudHMub25TbGlkZUxlYXZlLCB2KTtcbiAgICAgIHBlcmZvcm1Ib3Jpem9udGFsTW92ZShzbGlkZXMsIHYsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAqIFBlcmZvcm1zIHRoZSBob3Jpem9udGFsIG1vdmVtZW50LiAoQ1NTMyBvciBqUXVlcnkpXG4gICAgKlxuICAgICogQHBhcmFtIGZpcmVDYWxsYmFjayB7Qm9vbGVhbn0gLSBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRvIGZpcmUgdGhlIGNhbGxiYWNrXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHBlcmZvcm1Ib3Jpem9udGFsTW92ZShzbGlkZXMsIHYsIGZpcmVDYWxsYmFjaykge1xuICAgICAgdmFyIGRlc3RpbnlQb3MgPSB2LmRlc3RpbnlQb3M7XG4gICAgICBhY3RpdmVTbGlkZXNOYXZpZ2F0aW9uKHYuc2xpZGVzTmF2LCB2LnNsaWRlSW5kZXgpO1xuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxYOiBNYXRoLnJvdW5kKGRlc3RpbnlQb3MubGVmdClcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZ2V0T3B0aW9ucygpLmNzczMpIHtcbiAgICAgICAgdmFyIHRyYW5zbGF0ZTNkID0gJ3RyYW5zbGF0ZTNkKC0nICsgTWF0aC5yb3VuZChkZXN0aW55UG9zLmxlZnQpICsgJ3B4LCAwcHgsIDBweCknO1xuICAgICAgICBGUC50ZXN0LnRyYW5zbGF0ZTNkSFt2LnNlY3Rpb25JbmRleF0gPSB0cmFuc2xhdGUzZDtcbiAgICAgICAgY3NzKGFkZEFuaW1hdGlvbigkKFNMSURFU19DT05UQUlORVJfU0VMLCBzbGlkZXMpKSwgZ2V0VHJhbnNmb3Jtcyh0cmFuc2xhdGUzZCkpO1xuICAgICAgICBjbGVhclRpbWVvdXQoZ19hZnRlclNsaWRlTG9hZHNJZCk7XG4gICAgICAgIGdfYWZ0ZXJTbGlkZUxvYWRzSWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoZmlyZUNhbGxiYWNrKSB7XG4gICAgICAgICAgICBhZnRlclNsaWRlTG9hZHModik7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBnZXRPcHRpb25zKCkuc2Nyb2xsaW5nU3BlZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgRlAudGVzdC5sZWZ0W3Yuc2VjdGlvbkluZGV4XSA9IE1hdGgucm91bmQoZGVzdGlueVBvcy5sZWZ0KTtcbiAgICAgICAgc2Nyb2xsVG8oc2xpZGVzLCBNYXRoLnJvdW5kKGRlc3RpbnlQb3MubGVmdCksIGdldE9wdGlvbnMoKS5zY3JvbGxpbmdTcGVlZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChmaXJlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIGFmdGVyU2xpZGVMb2Fkcyh2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAqIFJldHVucyBgcmlnaHRgIG9yIGBsZWZ0YCBkZXBlbmRpbmcgb24gdGhlIHNjcm9sbGluZyBtb3ZlbWVudCB0byByZWFjaCBpdHMgZGVzdGluYXRpb25cbiAgICAqIGZyb20gdGhlIGN1cnJlbnQgc2xpZGUuXG4gICAgKi9cblxuXG4gICAgZnVuY3Rpb24gZ2V0WG1vdmVtZW50KGZyb21JbmRleCwgdG9JbmRleCkge1xuICAgICAgaWYgKGZyb21JbmRleCA9PSB0b0luZGV4KSB7XG4gICAgICAgIHJldHVybiAnbm9uZSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcm9tSW5kZXggPiB0b0luZGV4KSB7XG4gICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uRGVzdHJveSQ2KCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGdfYWZ0ZXJTbGlkZUxvYWRzSWQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFmdGVyU2xpZGVMb2Fkcyh2KSB7XG4gICAgICAvL2lmIHRoZSBzaXRlIGlzIG5vdCBqdXN0IHJlc2l6aW5nIGFuZCByZWFkanVzdGluZyB0aGUgc2xpZGVzXG4gICAgICBpZiAoIXYubG9jYWxJc1Jlc2l6aW5nKSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGdldE9wdGlvbnMoKS5hZnRlclNsaWRlTG9hZCkpIHtcbiAgICAgICAgICBmaXJlQ2FsbGJhY2soJ2FmdGVyU2xpZGVMb2FkJywgdik7XG4gICAgICAgIH0gLy9uZWVkcyB0byBiZSBpbnNpZGUgdGhlIGNvbmRpdGlvbiB0byBwcmV2ZW50IHByb2JsZW1zIHdpdGggY29udGludW91c1ZlcnRpY2FsIGFuZCBzY3JvbGxIb3Jpem9udGFsbHlcbiAgICAgICAgLy9hbmQgdG8gcHJldmVudCBkb3VibGUgc2Nyb2xsIHJpZ2h0IGFmdGVyIGEgd2luZG93cyByZXNpemVcblxuXG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBjYW5TY3JvbGw6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHBsYXlNZWRpYSh2LmRlc3RpbnkpO1xuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdChldmVudHMuYWZ0ZXJTbGlkZUxvYWRzLCB2KTtcbiAgICAgIH0gLy9sZXR0aW5nIHRoZW0gc2xpZGUgYWdhaW5cblxuXG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIHNsaWRlTW92aW5nOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBTbGlkZXMgc2lsZW50bHkgKHdpdGggbm8gYW5pbWF0aW9uKSB0aGUgYWN0aXZlIHNsaWRlciB0byB0aGUgZ2l2ZW4gc2xpZGUuXG4gICAgKiBAcGFyYW0gbm9DYWxsYmFjayB7Ym9vbH0gdHJ1ZSBvciBkZWZpbmVkIC0+IG5vIGNhbGxiYWNrc1xuICAgICovXG5cbiAgICBmdW5jdGlvbiBzaWxlbnRMYW5kc2NhcGVTY3JvbGwoYWN0aXZlU2xpZGUsIG5vQ2FsbGJhY2tzKSB7XG4gICAgICBzZXRTY3JvbGxpbmdTcGVlZCgwLCAnaW50ZXJuYWwnKTtcblxuICAgICAgaWYgKHR5cGVvZiBub0NhbGxiYWNrcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy9wcmV2ZW50aW5nIGZpcmluZyBjYWxsYmFja3MgYWZ0ZXJTbGlkZUxvYWQgZXRjLlxuICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgaXNSZXNpemluZzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbGFuZHNjYXBlU2Nyb2xsKGNsb3Nlc3QoYWN0aXZlU2xpZGUsIFNMSURFU19XUkFQUEVSX1NFTCksIGFjdGl2ZVNsaWRlKTtcblxuICAgICAgaWYgKHR5cGVvZiBub0NhbGxiYWNrcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgIGlzUmVzaXppbmc6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBzZXRTY3JvbGxpbmdTcGVlZChnZXRPcmlnaW5hbHMoKS5zY3JvbGxpbmdTcGVlZCwgJ2ludGVybmFsJyk7XG4gICAgfVxuXG4gICAgdmFyIGdfcHJldkFjdGl2ZVNlY3Rpb25JbmRleCA9IG51bGw7XG4gICAgdmFyIGdfcHJldkFjdGl2ZVNsaWRlSW5kZXggPSBudWxsO1xuICAgIC8qKiBcbiAgICAgKiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgYXBwLlxuICAgICAqL1xuXG4gICAgZnVuY3Rpb24gdXBkYXRlU3RhdGUoKSB7XG4gICAgICBzdGF0ZS5hY3RpdmVTZWN0aW9uID0gbnVsbDtcbiAgICAgIHN0YXRlLnNlY3Rpb25zLm1hcChmdW5jdGlvbiAoc2VjdGlvbikge1xuICAgICAgICB2YXIgaXNBY3RpdmUgPSBoYXNDbGFzcyhzZWN0aW9uLml0ZW0sIEFDVElWRSk7XG4gICAgICAgIHNlY3Rpb24uaXNBY3RpdmUgPSBpc0FjdGl2ZTtcbiAgICAgICAgc2VjdGlvbi5oYXNTY3JvbGwgPSBzY3JvbGxPdmVyZmxvd0hhbmRsZXIuaGFzU2Nyb2xsKHNlY3Rpb24uaXRlbSk7XG5cbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgc3RhdGUuYWN0aXZlU2VjdGlvbiA9IHNlY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VjdGlvbi5zbGlkZXMubGVuZ3RoKSB7XG4gICAgICAgICAgc2VjdGlvbi5hY3RpdmVTbGlkZSA9IG51bGw7XG4gICAgICAgICAgc2VjdGlvbi5zbGlkZXMubWFwKGZ1bmN0aW9uIChzbGlkZSkge1xuICAgICAgICAgICAgdmFyIGlzQWN0aXZlU2xpZGUgPSBoYXNDbGFzcyhzbGlkZS5pdGVtLCBBQ1RJVkUpO1xuICAgICAgICAgICAgc2xpZGUuaGFzU2Nyb2xsID0gc2Nyb2xsT3ZlcmZsb3dIYW5kbGVyLmhhc1Njcm9sbChzZWN0aW9uLml0ZW0pO1xuICAgICAgICAgICAgc2xpZGUuaXNBY3RpdmUgPSBpc0FjdGl2ZVNsaWRlO1xuXG4gICAgICAgICAgICBpZiAoaXNBY3RpdmVTbGlkZSkge1xuICAgICAgICAgICAgICBzZWN0aW9uLmFjdGl2ZVNsaWRlID0gc2xpZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgc2Nyb2xsVG9OZXdBY3RpdmVQYW5lbCgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVTdHJ1Y3R1cmFsU3RhdGUoKSB7XG4gICAgICB2YXIgYWxsU2VjdGlvbkl0ZW1zID0gJChnZXRPcHRpb25zKCkuc2VjdGlvblNlbGVjdG9yLCBnZXRDb250YWluZXIoKSk7XG4gICAgICB2YXIgc2VjdGlvbnNJdGVtcyA9IGdldFZpc2libGUoYWxsU2VjdGlvbkl0ZW1zKTtcbiAgICAgIHZhciBhbGxTZWN0aW9ucyA9IEFycmF5LmZyb20oYWxsU2VjdGlvbkl0ZW1zKS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWN0aW9uUGFuZWwoaXRlbSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBzZWN0aW9ucyA9IGFsbFNlY3Rpb25zLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS5pc1Zpc2libGU7XG4gICAgICB9KTtcbiAgICAgIHZhciBzbGlkZXMgPSBzZWN0aW9ucy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgc2VjdGlvbikge1xuICAgICAgICByZXR1cm4gYWNjLmNvbmNhdChzZWN0aW9uLnNsaWRlcyk7XG4gICAgICB9LCBbXSk7IC8vIGtlZXBpbmcgdHJhY2sgb2YgdGhlIHByZXZpb3VzbHkgYWN0aXZlIHNlY3Rpb25cblxuICAgICAgZ19wcmV2QWN0aXZlU2VjdGlvbkluZGV4ID0gZ2V0UHJldkFjdGl2ZVBhbmVsSW5kZXgoc3RhdGUuYWN0aXZlU2VjdGlvbik7XG4gICAgICBnX3ByZXZBY3RpdmVTbGlkZUluZGV4ID0gZ2V0UHJldkFjdGl2ZVBhbmVsSW5kZXgoc3RhdGUuYWN0aXZlU2VjdGlvbiA/IHN0YXRlLmFjdGl2ZVNlY3Rpb24uYWN0aXZlU2xpZGUgOiBudWxsKTtcbiAgICAgIHN0YXRlLm51bVNlY3Rpb25zID0gc2VjdGlvbnNJdGVtcy5sZW5ndGg7XG4gICAgICBzdGF0ZS5udW1TbGlkZXMgPSBzZWN0aW9ucy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgc2VjdGlvbikge1xuICAgICAgICByZXR1cm4gYWNjICsgc2VjdGlvbi5zbGlkZXMubGVuZ3RoO1xuICAgICAgfSwgMCk7XG4gICAgICBzdGF0ZS5zZWN0aW9ucyA9IHNlY3Rpb25zO1xuICAgICAgc3RhdGUuc2VjdGlvbnNJbmNsdWRpbmdIaWRkZW4gPSBhbGxTZWN0aW9ucztcbiAgICAgIHN0YXRlLnNsaWRlcyA9IHNsaWRlcztcbiAgICAgIHN0YXRlLnBhbmVscyA9IHN0YXRlLnNlY3Rpb25zLmNvbmNhdChzdGF0ZS5zbGlkZXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFByZXZBY3RpdmVQYW5lbEluZGV4KGFjdGl2ZVBhbmVsKSB7XG4gICAgICBpZiAoIWFjdGl2ZVBhbmVsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJldkFjdGl2ZVBhbmVsSXRlbSA9IGFjdGl2ZVBhbmVsID8gYWN0aXZlUGFuZWwuaXRlbSA6IG51bGw7XG4gICAgICB2YXIgaGlkZGVuUGFuZWxzID0gYWN0aXZlUGFuZWwuaXNTZWN0aW9uID8gc3RhdGUuc2VjdGlvbnNJbmNsdWRpbmdIaWRkZW4gOiBzdGF0ZS5hY3RpdmVTZWN0aW9uLnNsaWRlc0luY2x1ZGluZ0hpZGRlbjtcblxuICAgICAgaWYgKHByZXZBY3RpdmVQYW5lbEl0ZW0pIHtcbiAgICAgICAgdmFyIHBhbmVsID0gZ2V0UGFuZWxCeUVsZW1lbnQoaGlkZGVuUGFuZWxzLCBwcmV2QWN0aXZlUGFuZWxJdGVtKTtcbiAgICAgICAgcmV0dXJuIHBhbmVsID8gcGFuZWwuaW5kZXgoKSA6IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIGNoYW5nZXMgaW4gdGhlIERPTSB0YWtlIHBsYWNlIHRoZXJlJ3MgYSBjaGFuZ2UgXG4gICAgICogdGhlIGFjdGl2ZSBzZWN0aW9uIGlzIG5vdyBoaWRkZW4gb3IgcmVtb3ZlZC4gXG4gICAgICogZnVsbFBhZ2UuanMgd2lsbCBzY3JvbGwgdG8gdGhlIGNsb3Nlc3Qgc2VjdGlvbiBuZWFyYnkuXG4gICAgICovXG5cblxuICAgIGZ1bmN0aW9uIHNjcm9sbFRvTmV3QWN0aXZlUGFuZWwoKSB7XG4gICAgICB2YXIgYWN0aXZlU2VjdGlvbiA9IHN0YXRlLmFjdGl2ZVNlY3Rpb247XG4gICAgICB2YXIgYWN0aXZlU2VjdGlvbkhhc1NsaWRlcyA9IHN0YXRlLmFjdGl2ZVNlY3Rpb24gPyBzdGF0ZS5hY3RpdmVTZWN0aW9uLnNsaWRlcy5sZW5ndGggOiBmYWxzZTtcbiAgICAgIHZhciBhY3RpdmVTbGlkZSA9IHN0YXRlLmFjdGl2ZVNlY3Rpb24gPyBzdGF0ZS5hY3RpdmVTZWN0aW9uLmFjdGl2ZVNsaWRlIDogbnVsbDsgLy8gSGlkZGluZyAvIHJlbW92aW5nIHRoZSBhY3RpdmUgc2VjdGlvbiA/XG5cbiAgICAgIGlmICghYWN0aXZlU2VjdGlvbiAmJiBzdGF0ZS5zZWN0aW9ucy5sZW5ndGggJiYgIWdldFN0YXRlKCkuaXNCZXlvbmRGdWxscGFnZSAmJiBnX3ByZXZBY3RpdmVTZWN0aW9uSW5kZXgpIHtcbiAgICAgICAgdmFyIG5ld0FjdGl2ZVNlY3Rpb24gPSBnZXROZXdBY3RpdmVQYW5lbChnX3ByZXZBY3RpdmVTZWN0aW9uSW5kZXgsIHN0YXRlLnNlY3Rpb25zKTtcblxuICAgICAgICBpZiAobmV3QWN0aXZlU2VjdGlvbikge1xuICAgICAgICAgIHN0YXRlLmFjdGl2ZVNlY3Rpb24gPSBuZXdBY3RpdmVTZWN0aW9uO1xuICAgICAgICAgIHN0YXRlLmFjdGl2ZVNlY3Rpb24uaXNBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgIGFkZENsYXNzKHN0YXRlLmFjdGl2ZVNlY3Rpb24uaXRlbSwgQUNUSVZFKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZS5hY3RpdmVTZWN0aW9uKSB7XG4gICAgICAgICAgc2lsZW50U2Nyb2xsKHN0YXRlLmFjdGl2ZVNlY3Rpb24uaXRlbS5vZmZzZXRUb3ApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3RpdmVTZWN0aW9uSGFzU2xpZGVzICYmICFhY3RpdmVTbGlkZSAmJiBnX3ByZXZBY3RpdmVTbGlkZUluZGV4KSB7XG4gICAgICAgIHZhciBuZXdBY3RpdmVTbGlkZSA9IGdldE5ld0FjdGl2ZVBhbmVsKGdfcHJldkFjdGl2ZVNsaWRlSW5kZXgsIHN0YXRlLmFjdGl2ZVNlY3Rpb24uc2xpZGVzKTtcblxuICAgICAgICBpZiAobmV3QWN0aXZlU2xpZGUpIHtcbiAgICAgICAgICBzdGF0ZS5hY3RpdmVTZWN0aW9uLmFjdGl2ZVNsaWRlID0gbmV3QWN0aXZlU2xpZGU7XG4gICAgICAgICAgc3RhdGUuYWN0aXZlU2VjdGlvbi5hY3RpdmVTbGlkZS5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgYWRkQ2xhc3Moc3RhdGUuYWN0aXZlU2VjdGlvbi5hY3RpdmVTbGlkZS5pdGVtLCBBQ1RJVkUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLmFjdGl2ZVNlY3Rpb24uYWN0aXZlU2xpZGUpIHtcbiAgICAgICAgICBzaWxlbnRMYW5kc2NhcGVTY3JvbGwoc3RhdGUuYWN0aXZlU2VjdGlvbi5hY3RpdmVTbGlkZS5pdGVtLCAnaW50ZXJuYWwnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldE5ld0FjdGl2ZVBhbmVsKHByZXZBY3RpdmVQYW5lbEluZGV4LCBzaWJsaW5ncykge1xuICAgICAgdmFyIG5ld0FjdGl2ZVNlY3Rpb247XG4gICAgICB2YXIgcHJldkluZGV4ID0gcHJldkFjdGl2ZVBhbmVsSW5kZXggLSAxO1xuICAgICAgdmFyIG5leHRJbmRleCA9IHByZXZBY3RpdmVQYW5lbEluZGV4O1xuXG4gICAgICBkbyB7XG4gICAgICAgIG5ld0FjdGl2ZVNlY3Rpb24gPSBzaWJsaW5nc1twcmV2SW5kZXhdIHx8IHNpYmxpbmdzW25leHRJbmRleF07XG5cbiAgICAgICAgaWYgKG5ld0FjdGl2ZVNlY3Rpb24pIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZJbmRleCA9IHByZXZJbmRleCAtIDE7XG4gICAgICAgIG5leHRJbmRleCA9IG5leHRJbmRleCArIDE7XG4gICAgICB9IHdoaWxlIChwcmV2SW5kZXggPj0gMCB8fCBuZXh0SW5kZXggPCBzaWJsaW5ncy5sZW5ndGgpO1xuXG4gICAgICByZXR1cm4gbmV3QWN0aXZlU2VjdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBTZWN0aW9uIG9iamVjdFxuICAgICovXG5cblxuICAgIHZhciBTZWN0aW9uUGFuZWwgPSBmdW5jdGlvbiBTZWN0aW9uUGFuZWwoZWwpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIFtdLnB1c2guY2FsbChhcmd1bWVudHMsIGdldE9wdGlvbnMoKS5zZWN0aW9uU2VsZWN0b3IpO1xuICAgICAgSXRlbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgdGhpcy5hbGxTbGlkZXNJdGVtcyA9ICQoZ2V0T3B0aW9ucygpLnNsaWRlU2VsZWN0b3IsIGVsKTtcbiAgICAgIHRoaXMuc2xpZGVzSW5jbHVkaW5nSGlkZGVuID0gQXJyYXkuZnJvbSh0aGlzLmFsbFNsaWRlc0l0ZW1zKS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTbGlkZVBhbmVsKGl0ZW0sIF90aGlzKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zbGlkZXMgPSB0aGlzLnNsaWRlc0luY2x1ZGluZ0hpZGRlbi5maWx0ZXIoZnVuY3Rpb24gKHNsaWRlUGFuZWwpIHtcbiAgICAgICAgcmV0dXJuIHNsaWRlUGFuZWwuaXNWaXNpYmxlO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmFjdGl2ZVNsaWRlID0gdGhpcy5zbGlkZXMubGVuZ3RoID8gdGhpcy5zbGlkZXMuZmlsdGVyKGZ1bmN0aW9uIChzbGlkZSkge1xuICAgICAgICByZXR1cm4gc2xpZGUuaXNBY3RpdmU7XG4gICAgICB9KVswXSB8fCB0aGlzLnNsaWRlc1swXSA6IG51bGw7XG4gICAgfTtcbiAgICBTZWN0aW9uUGFuZWwucHJvdG90eXBlID0gSXRlbS5wcm90b3R5cGU7XG4gICAgU2VjdGlvblBhbmVsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNlY3Rpb25QYW5lbDtcbiAgICAvKipcbiAgICAqIFNsaWRlIG9iamVjdFxuICAgICovXG5cbiAgICB2YXIgU2xpZGVQYW5lbCA9IGZ1bmN0aW9uIFNsaWRlUGFuZWwoZWwsIHNlY3Rpb24pIHtcbiAgICAgIHRoaXMucGFyZW50ID0gc2VjdGlvbjtcbiAgICAgIEl0ZW0uY2FsbCh0aGlzLCBlbCwgZ2V0T3B0aW9ucygpLnNsaWRlU2VsZWN0b3IpO1xuICAgIH07XG5cbiAgICBTbGlkZVBhbmVsLnByb3RvdHlwZSA9IEl0ZW0ucHJvdG90eXBlO1xuICAgIFNsaWRlUGFuZWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2VjdGlvblBhbmVsO1xuXG4gICAgLyoqXG4gICAgKiBBZGRzIGludGVybmFsIGNsYXNzZXMgdG8gYmUgYWJsZSB0byBwcm92aWRlIGN1c3RvbWl6YWJsZSBzZWxlY3RvcnNcbiAgICAqIGtlZXBpbmcgdGhlIGxpbmsgd2l0aCB0aGUgc3R5bGUgc2hlZXQuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGFkZEludGVybmFsU2VsZWN0b3JzKCkge1xuICAgICAgYWRkQ2xhc3MoJChnZXRPcHRpb25zKCkuc2VjdGlvblNlbGVjdG9yLCBnZXRDb250YWluZXIoKSksIFNFQ1RJT04pO1xuICAgICAgYWRkQ2xhc3MoJChnZXRPcHRpb25zKCkuc2xpZGVTZWxlY3RvciwgZ2V0Q29udGFpbmVyKCkpLCBTTElERSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBTdHlsZXMgdGhlIGhvcml6b250YWwgc2xpZGVzIGZvciBhIHNlY3Rpb24uXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHN0eWxlU2xpZGVzKHNlY3Rpb24pIHtcbiAgICAgIHZhciBudW1TbGlkZXMgPSBzZWN0aW9uLnNsaWRlcy5sZW5ndGg7XG4gICAgICB2YXIgc2xpZGVzRWxlbXMgPSBzZWN0aW9uLmFsbFNsaWRlc0l0ZW1zO1xuICAgICAgdmFyIHNsaWRlcyA9IHNlY3Rpb24uc2xpZGVzO1xuICAgICAgdmFyIHNsaWRlcldpZHRoID0gbnVtU2xpZGVzICogMTAwO1xuICAgICAgdmFyIHNsaWRlV2lkdGggPSAxMDAgLyBudW1TbGlkZXM7XG5cbiAgICAgIGlmICghJChTTElERVNfV1JBUFBFUl9TRUwsIHNlY3Rpb24uaXRlbSlbMF0pIHtcbiAgICAgICAgdmFyIHNsaWRlc1dyYXBwZXIgPSBkb2MuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHNsaWRlc1dyYXBwZXIuY2xhc3NOYW1lID0gU0xJREVTX1dSQVBQRVI7IC8vZnAtc2xpZGVzXG5cbiAgICAgICAgd3JhcEFsbChzbGlkZXNFbGVtcywgc2xpZGVzV3JhcHBlcik7XG4gICAgICAgIHZhciBzbGlkZXNDb250YWluZXIgPSBkb2MuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHNsaWRlc0NvbnRhaW5lci5jbGFzc05hbWUgPSBTTElERVNfQ09OVEFJTkVSOyAvL2ZwLXNsaWRlc0NvbnRhaW5lclxuXG4gICAgICAgIHdyYXBBbGwoc2xpZGVzRWxlbXMsIHNsaWRlc0NvbnRhaW5lcik7XG4gICAgICB9XG5cbiAgICAgIGNzcygkKFNMSURFU19DT05UQUlORVJfU0VMLCBzZWN0aW9uLml0ZW0pLCB7XG4gICAgICAgICd3aWR0aCc6IHNsaWRlcldpZHRoICsgJyUnXG4gICAgICB9KTtcblxuICAgICAgaWYgKG51bVNsaWRlcyA+IDEpIHtcbiAgICAgICAgaWYgKGdldE9wdGlvbnMoKS5jb250cm9sQXJyb3dzKSB7XG4gICAgICAgICAgY3JlYXRlU2xpZGVBcnJvd3Moc2VjdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ2V0T3B0aW9ucygpLnNsaWRlc05hdmlnYXRpb24pIHtcbiAgICAgICAgICBhZGRTbGlkZXNOYXZpZ2F0aW9uKHNlY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNsaWRlcy5mb3JFYWNoKGZ1bmN0aW9uIChzbGlkZSkge1xuICAgICAgICBjc3Moc2xpZGUuaXRlbSwge1xuICAgICAgICAgICd3aWR0aCc6IHNsaWRlV2lkdGggKyAnJSdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGdldE9wdGlvbnMoKS52ZXJ0aWNhbENlbnRlcmVkKSB7XG4gICAgICAgICAgYWRkVGFibGVDbGFzcyhzbGlkZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdmFyIHN0YXJ0aW5nU2xpZGUgPSBzZWN0aW9uLmFjdGl2ZVNsaWRlIHx8IG51bGw7IC8vaWYgdGhlIHNsaWRlIHdvbid0IGJlIGFuIHN0YXJ0aW5nIHBvaW50LCB0aGUgZGVmYXVsdCB3aWxsIGJlIHRoZSBmaXJzdCBvbmVcbiAgICAgIC8vdGhlIGFjdGl2ZSBzZWN0aW9uIGlzbid0IHRoZSBmaXJzdCBvbmU/IElzIG5vdCB0aGUgZmlyc3Qgc2xpZGUgb2YgdGhlIGZpcnN0IHNlY3Rpb24/IFRoZW4gd2UgbG9hZCB0aGF0IHNlY3Rpb24vc2xpZGUgYnkgZGVmYXVsdC5cblxuICAgICAgaWYgKHN0YXJ0aW5nU2xpZGUgIT0gbnVsbCAmJiBzdGF0ZS5hY3RpdmVTZWN0aW9uICYmIChzdGF0ZS5hY3RpdmVTZWN0aW9uLmluZGV4KCkgIT09IDAgfHwgc3RhdGUuYWN0aXZlU2VjdGlvbi5pbmRleCgpID09PSAwICYmIHN0YXJ0aW5nU2xpZGUuaW5kZXgoKSAhPT0gMCkpIHtcbiAgICAgICAgc2lsZW50TGFuZHNjYXBlU2Nyb2xsKHN0YXJ0aW5nU2xpZGUuaXRlbSwgJ2ludGVybmFsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRDbGFzcyhzbGlkZXNFbGVtc1swXSwgQUNUSVZFKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZ193cmFwcGVyT2JzZXJ2ZXI7XG4gICAgdmFyIGdfd3JhcHBlck9ic2VydmVDb25maWcgPSB7XG4gICAgICBhdHRyaWJ1dGVzOiBmYWxzZSxcbiAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gICAgfTtcbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRzLmJpbmRFdmVudHMsIGJpbmRFdmVudHMkOSk7XG4gICAgRlBbXCJyZW5kZXJcIl0gPSBvbkNvbnRlbnRDaGFuZ2U7XG5cbiAgICBmdW5jdGlvbiBiaW5kRXZlbnRzJDkoKSB7XG4gICAgICBpZiAoZ2V0T3B0aW9ucygpLm9ic2VydmVyICYmIFwiTXV0YXRpb25PYnNlcnZlclwiIGluIHdpbmRvdyAmJiAkKFdSQVBQRVJfU0VMKVswXSkge1xuICAgICAgICBnX3dyYXBwZXJPYnNlcnZlciA9IGNyZWF0ZU9ic2VydmVyKCQoV1JBUFBFUl9TRUwpWzBdLCBvbkNvbnRlbnRDaGFuZ2UsIGdfd3JhcHBlck9ic2VydmVDb25maWcpO1xuICAgICAgfVxuXG4gICAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRzLmNvbnRlbnRDaGFuZ2VkLCBvbkNvbnRlbnRDaGFuZ2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTXV0YXRpb24gb2JzZXJ2ZXIuXG4gICAgICovXG5cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZU9ic2VydmVyKHRhcmdldCwgY2FsbGJhY2ssIGNvbmZpZykge1xuICAgICAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0YXJnZXQsIGNvbmZpZyk7XG4gICAgICByZXR1cm4gb2JzZXJ2ZXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGlkU2xpZGVzQ2hhbmdlKCkge1xuICAgICAgcmV0dXJuIGdldFZpc2libGUoJChnZXRPcHRpb25zKCkuc2xpZGVTZWxlY3RvciwgZ2V0Q29udGFpbmVyKCkpKS5sZW5ndGggIT09IGdldFN0YXRlKCkubnVtU2xpZGVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpZFNlY3Rpb25zQ2hhbmdlKCkge1xuICAgICAgcmV0dXJuIGdldFZpc2libGUoJChnZXRPcHRpb25zKCkuc2VjdGlvblNlbGVjdG9yLCBnZXRDb250YWluZXIoKSkpLmxlbmd0aCAhPT0gZ2V0U3RhdGUoKS5udW1TZWN0aW9ucztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkaWRTZWN0aW9uc09yU2xpZGVzQ2hhbmdlKCkge1xuICAgICAgcmV0dXJuIGRpZFNsaWRlc0NoYW5nZSgpIHx8IGRpZFNlY3Rpb25zQ2hhbmdlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3RlbiB0byBjaGFuZ2VzIG9uIHNlY3Rpb25zIGFuZCBmaXJlcyByZUJ1aWxkXG4gICAgICogd2hlbiB0aG9zZSBjaGFuZ2VzIGFmZmVjdCB0aGUgc2VjdGlvbiBoZWlnaHQuXG4gICAgICovXG5cblxuICAgIGZ1bmN0aW9uIG9uQ29udGVudENoYW5nZShtdXRhdGlvbnMpIHtcbiAgICAgIHZhciBfZGlkU2xpZGVzQ2hhbmdlID0gZGlkU2xpZGVzQ2hhbmdlKCk7XG5cbiAgICAgIGlmIChkaWRTZWN0aW9uc09yU2xpZGVzQ2hhbmdlKCkgJiYgIXN0YXRlLmlzRG9pbmdDb250aW5vdXNWZXJ0aWNhbCkge1xuICAgICAgICBpZiAoZ2V0T3B0aW9ucygpLm9ic2VydmVyICYmIGdfd3JhcHBlck9ic2VydmVyKSB7XG4gICAgICAgICAgLy8gVGVtcG9yYWxseSBkaXNhYmxpbmcgdGhlIG9ic2VydmVyIHdoaWxlIFxuICAgICAgICAgIC8vIHdlIG1vZGlkeSB0aGUgRE9NIGFnYWluXG4gICAgICAgICAgZ193cmFwcGVyT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlU3RydWN0dXJhbFN0YXRlKCk7XG4gICAgICAgIHVwZGF0ZVN0YXRlKCk7IC8vIFJlbW92aW5nIG5hdnMgYW5kIGFuY2hvcnMgb3B0aW9uc1xuXG4gICAgICAgIGdldE9wdGlvbnMoKS5hbmNob3JzID0gW107XG4gICAgICAgIHJlbW92ZSgkKFNFQ1RJT05fTkFWX1NFTCkpO1xuICAgICAgICBhZGRJbnRlcm5hbFNlbGVjdG9ycygpO1xuICAgICAgICBzZXRPcHRpb25zRnJvbURPTSgpO1xuXG4gICAgICAgIGlmIChnZXRPcHRpb25zKCkubmF2aWdhdGlvbikge1xuICAgICAgICAgIGFkZFZlcnRpY2FsTmF2aWdhdGlvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF9kaWRTbGlkZXNDaGFuZ2UpIHtcbiAgICAgICAgICByZW1vdmUoJChTTElERVNfTkFWX1NFTCkpO1xuICAgICAgICAgIHJlbW92ZSgkKFNMSURFU19BUlJPV19TRUwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFN0YXRlKCkuc2VjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc2VjdGlvbikge1xuICAgICAgICAgIGlmIChzZWN0aW9uLnNsaWRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChfZGlkU2xpZGVzQ2hhbmdlKSB7XG4gICAgICAgICAgICAgIHN0eWxlU2xpZGVzKHNlY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHlsZVNlY3Rpb24oc2VjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldE9wdGlvbnMoKS5vYnNlcnZlciAmJiBnX3dyYXBwZXJPYnNlcnZlciAmJiAkKFdSQVBQRVJfU0VMKVswXSkge1xuICAgICAgICBnX3dyYXBwZXJPYnNlcnZlci5vYnNlcnZlKCQoV1JBUFBFUl9TRUwpWzBdLCBnX3dyYXBwZXJPYnNlcnZlQ29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3VwcG9ydHNQYXNzaXZlRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy9jaGVrcyBmb3IgcGFzc2l2ZSBldmVudCBzdXBwb3J0XG4gICAgICB2YXIgZ19zdXBwb3J0c1Bhc3NpdmUgPSBmYWxzZTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgZ19zdXBwb3J0c1Bhc3NpdmUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHdpbmRvd0FkZEV2ZW50KFwidGVzdFBhc3NpdmVcIiwgbnVsbCwgb3B0cyk7XG4gICAgICAgIHdpbmRvd1JlbW92ZUV2ZW50KFwidGVzdFBhc3NpdmVcIiwgbnVsbCwgb3B0cyk7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZ19zdXBwb3J0c1Bhc3NpdmU7XG4gICAgICB9O1xuICAgIH0oKTtcblxuICAgIGZ1bmN0aW9uIGdldFBhc3NpdmVPcHRpb25zSWZQb3NzaWJsZSgpIHtcbiAgICAgIHJldHVybiBzdXBwb3J0c1Bhc3NpdmVFdmVudHMoKSA/IHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICAgIH0gOiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgd2hlZWxEYXRhSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfcHJldlRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICAgICAgdmFyIF9zY3JvbGxpbmdzID0gW107XG4gICAgICB2YXIgaXNTY3JvbGxpbmdWZXJ0aWNhbGx5O1xuICAgICAgdmFyIGRpcmVjdGlvbjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZ2lzdGVyRXZlbnQ6IGZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnQoZSkge1xuICAgICAgICAgIGUgPSBlIHx8IHdpbi5ldmVudDtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBlLndoZWVsRGVsdGEgfHwgLWUuZGVsdGFZIHx8IC1lLmRldGFpbDtcbiAgICAgICAgICB2YXIgZGVsdGEgPSBNYXRoLm1heCgtMSwgTWF0aC5taW4oMSwgdmFsdWUpKTtcbiAgICAgICAgICB2YXIgaG9yaXpvbnRhbERldGVjdGlvbiA9IHR5cGVvZiBlLndoZWVsRGVsdGFYICE9PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZS5kZWx0YVggIT09ICd1bmRlZmluZWQnO1xuICAgICAgICAgIGlzU2Nyb2xsaW5nVmVydGljYWxseSA9IE1hdGguYWJzKGUud2hlZWxEZWx0YVgpIDwgTWF0aC5hYnMoZS53aGVlbERlbHRhKSB8fCBNYXRoLmFicyhlLmRlbHRhWCkgPCBNYXRoLmFicyhlLmRlbHRhWSkgfHwgIWhvcml6b250YWxEZXRlY3Rpb247XG4gICAgICAgICAgdmFyIGN1clRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICBkaXJlY3Rpb24gPSBkZWx0YSA8IDAgPyAnZG93bicgOiAndXAnOyAvL0xpbWl0aW5nIHRoZSBhcnJheSB0byAxNTAgKGxldHMgbm90IHdhc3RlIG1lbW9yeSEpXG5cbiAgICAgICAgICBpZiAoX3Njcm9sbGluZ3MubGVuZ3RoID4gMTQ5KSB7XG4gICAgICAgICAgICBfc2Nyb2xsaW5ncy5zaGlmdCgpO1xuICAgICAgICAgIH0gLy9rZWVwaW5nIHJlY29yZCBvZiB0aGUgcHJldmlvdXMgc2Nyb2xsaW5nc1xuXG5cbiAgICAgICAgICBfc2Nyb2xsaW5ncy5wdXNoKE1hdGguYWJzKHZhbHVlKSk7IC8vdGltZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGxhc3Qgc2Nyb2xsIGFuZCB0aGUgY3VycmVudCBvbmVcblxuXG4gICAgICAgICAgdmFyIHRpbWVEaWZmID0gY3VyVGltZSAtIF9wcmV2VGltZTtcbiAgICAgICAgICBfcHJldlRpbWUgPSBjdXJUaW1lOyAvL2hhdmVuJ3QgdGhleSBzY3JvbGxlZCBpbiBhIHdoaWxlP1xuICAgICAgICAgIC8vKGVub3VnaCB0byBiZSBjb25zaWRlciBhIGRpZmZlcmVudCBzY3JvbGxpbmcgYWN0aW9uIHRvIHNjcm9sbCBhbm90aGVyIHNlY3Rpb24pXG5cbiAgICAgICAgICBpZiAodGltZURpZmYgPiAyMDApIHtcbiAgICAgICAgICAgIC8vZW1wdHlpbmcgdGhlIGFycmF5LCB3ZSBkb250IGNhcmUgYWJvdXQgb2xkIHNjcm9sbGluZ3MgZm9yIG91ciBhdmVyYWdlc1xuICAgICAgICAgICAgX3Njcm9sbGluZ3MgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGlzQWNjZWxlcmF0aW5nOiBmdW5jdGlvbiBpc0FjY2VsZXJhdGluZygpIHtcbiAgICAgICAgICB2YXIgYXZlcmFnZUVuZCA9IGdldEF2ZXJhZ2UoX3Njcm9sbGluZ3MsIDEwKTtcbiAgICAgICAgICB2YXIgYXZlcmFnZU1pZGRsZSA9IGdldEF2ZXJhZ2UoX3Njcm9sbGluZ3MsIDcwKTtcbiAgICAgICAgICB2YXIgaXNBY2NlbGVyYXRpbmcgPSBhdmVyYWdlRW5kID49IGF2ZXJhZ2VNaWRkbGU7XG4gICAgICAgICAgcmV0dXJuIF9zY3JvbGxpbmdzLmxlbmd0aCA/IGlzQWNjZWxlcmF0aW5nICYmIGlzU2Nyb2xsaW5nVmVydGljYWxseSA6IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBnZXREaXJlY3Rpb246IGZ1bmN0aW9uIGdldERpcmVjdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gZGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0oKTtcblxuICAgIGZ1bmN0aW9uIHNjcm9sbEJleW9uZEZ1bGxQYWdlKCkge1xuICAgICAgdmFyIGR0b3AgPSBnZXREZXN0aW5hdGlvbk9mZnNldCgpO1xuICAgICAgdmFyIHNjcm9sbFNldHRpbmdzID0gZ2V0U2Nyb2xsU2V0dGluZ3MoZHRvcCk7XG4gICAgICBGUC50ZXN0LnRvcCA9IC1kdG9wICsgJ3B4JztcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgY2FuU2Nyb2xsOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBzY3JvbGxUbyhzY3JvbGxTZXR0aW5ncy5lbGVtZW50LCBzY3JvbGxTZXR0aW5ncy5vcHRpb25zLCBnZXRPcHRpb25zKCkuc2Nyb2xsaW5nU3BlZWQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgICAgaXNCZXlvbmRGdWxscGFnZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgIGNhblNjcm9sbDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAzMCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb25LZXlEb3duKCkge1xuICAgICAgaWYgKCFpc0Z1bGxQYWdlQWJvdmUoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY3JvbGxVcFRvRnVsbHBhZ2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc2Nyb2xsVXBUb0Z1bGxwYWdlKCkge1xuICAgICAgdmFyIHNjcm9sbFNldHRpbmdzID0gZ2V0U2Nyb2xsU2V0dGluZ3MoZ2V0TGFzdChnZXRTdGF0ZSgpLnNlY3Rpb25zKS5pdGVtLm9mZnNldFRvcCk7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGNhblNjcm9sbDogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgc2Nyb2xsVG8oc2Nyb2xsU2V0dGluZ3MuZWxlbWVudCwgc2Nyb2xsU2V0dGluZ3Mub3B0aW9ucywgZ2V0T3B0aW9ucygpLnNjcm9sbGluZ1NwZWVkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBjYW5TY3JvbGw6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBpc0JleW9uZEZ1bGxwYWdlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgIGlzQWJvdXRUb1Njcm9sbFRvRnVsbFBhZ2U6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RGVzdGluYXRpb25PZmZzZXQoKSB7XG4gICAgICBpZiAoIWdldE9wdGlvbnMoKS5jc3MzKSB7XG4gICAgICAgIHJldHVybiBnZXRMYXN0KGdldFN0YXRlKCkuc2VjdGlvbnMpLml0ZW0ub2Zmc2V0VG9wICsgZ2V0TGFzdChnZXRTdGF0ZSgpLnNlY3Rpb25zKS5pdGVtLm9mZnNldEhlaWdodDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGdldFNjcm9sbFRvcCgpICsgZ2V0V2luZG93SGVpZ2h0KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYmV5b25kRnVsbFBhZ2VIYW5kbGVyKGNvbnRhaW5lciwgZSkge1xuICAgICAgbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICB2YXIgcGF1c2VTY3JvbGwgPSBnZXRTdGF0ZSgpLmlzQmV5b25kRnVsbHBhZ2UgJiYgY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSA+PSAwICYmIHdoZWVsRGF0YUhhbmRsZXIuZ2V0RGlyZWN0aW9uKCkgPT09ICd1cCc7XG4gICAgICB2YXIgZ19pc0Fib3V0VG9TY3JvbGxUb0Z1bGxQYWdlID0gZ2V0U3RhdGUoKS5pc0Fib3V0VG9TY3JvbGxUb0Z1bGxQYWdlO1xuXG4gICAgICBpZiAoZ19pc0Fib3V0VG9TY3JvbGxUb0Z1bGxQYWdlKSB7XG4gICAgICAgIHByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRTdGF0ZSgpLmlzQmV5b25kRnVsbHBhZ2UpIHtcbiAgICAgICAgaWYgKCFwYXVzZVNjcm9sbCkge1xuICAgICAgICAgIGtleWZyYW1lVGltZSgnc2V0JywgJ2JleW9uZEZ1bGxwYWdlJywgMTAwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHNob3VsZFNldEZpeGVkUG9zaXRpb24gPSAhZ19pc0Fib3V0VG9TY3JvbGxUb0Z1bGxQYWdlICYmICgha2V5ZnJhbWVUaW1lKCdpc05ld0tleWZyYW1lJywgJ2JleW9uZEZ1bGxwYWdlJykgfHwgIXdoZWVsRGF0YUhhbmRsZXIuaXNBY2NlbGVyYXRpbmcoKSk7XG4gICAgICAgICAgdmFyIHNjcm9sbFNldHRpbmdzO1xuXG4gICAgICAgICAgaWYgKHNob3VsZFNldEZpeGVkUG9zaXRpb24pIHtcbiAgICAgICAgICAgIHNjcm9sbFNldHRpbmdzID0gZ2V0U2Nyb2xsU2V0dGluZ3MoZ2V0TGFzdChnZXRTdGF0ZSgpLnNlY3Rpb25zKS5pdGVtLm9mZnNldFRvcCArIGdldExhc3QoZ2V0U3RhdGUoKS5zZWN0aW9ucykuaXRlbS5vZmZzZXRIZWlnaHQpO1xuICAgICAgICAgICAgc2Nyb2xsU2V0dGluZ3MuZWxlbWVudC5zY3JvbGxUbygwLCBzY3JvbGxTZXR0aW5ncy5vcHRpb25zKTtcbiAgICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgICAgaXNBYm91dFRvU2Nyb2xsVG9GdWxsUGFnZTogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcHJldmVudERlZmF1bHQoZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmICh3aGVlbERhdGFIYW5kbGVyLmlzQWNjZWxlcmF0aW5nKCkpIHtcbiAgICAgICAgICAgIHBhdXNlU2Nyb2xsID0gZmFsc2U7XG4gICAgICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGlzQWJvdXRUb1Njcm9sbFRvRnVsbFBhZ2U6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBzY3JvbGxUcmlnZ2VyOiAnd2hlZWwnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNjcm9sbFVwVG9GdWxscGFnZSgpO1xuICAgICAgICAgICAgcHJldmVudERlZmF1bHQoZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFnX2lzQWJvdXRUb1Njcm9sbFRvRnVsbFBhZ2UpIHtcbiAgICAgICAgICAvLyBhbGxvdyBub3JtYWwgc2Nyb2xsaW5nLCBidXQgcXVpdHRpbmdcbiAgICAgICAgICBpZiAoIXBhdXNlU2Nyb2xsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5ZnJhbWVUaW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGlzTmV3ID0gZmFsc2U7XG4gICAgICB2YXIgZnJhbWVzID0ge307XG4gICAgICB2YXIgdGltZWZyYW1lcyA9IHt9O1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24sIG5hbWUsIHRpbWVmcmFtZSkge1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICAgIGNhc2UgJ3NldCc6XG4gICAgICAgICAgICBmcmFtZXNbbmFtZV0gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIHRpbWVmcmFtZXNbbmFtZV0gPSB0aW1lZnJhbWU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2lzTmV3S2V5ZnJhbWUnOlxuICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIGlzTmV3ID0gY3VycmVudCAtIGZyYW1lc1tuYW1lXSA+IHRpbWVmcmFtZXNbbmFtZV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc05ldztcbiAgICAgIH07XG4gICAgfSgpO1xuXG4gICAgRlAubW92ZVNlY3Rpb25Eb3duID0gbW92ZVNlY3Rpb25Eb3duO1xuICAgIC8qKlxuICAgICogTW92ZXMgdGhlIHBhZ2UgZG93biBvbmUgc2VjdGlvbi5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gbW92ZVNlY3Rpb25Eb3duKCkge1xuICAgICAgdmFyIG5leHQgPSBnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb24ubmV4dCgpOyAvL2xvb3BpbmcgdG8gdGhlIHRvcCBpZiB0aGVyZSdzIG5vIG1vcmUgc2VjdGlvbnMgYmVsb3dcblxuICAgICAgaWYgKCFuZXh0ICYmIChnZXRPcHRpb25zKCkubG9vcEJvdHRvbSB8fCBnZXRPcHRpb25zKCkuY29udGludW91c1ZlcnRpY2FsKSkge1xuICAgICAgICBuZXh0ID0gZ2V0U3RhdGUoKS5zZWN0aW9uc1swXTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5leHQgIT0gbnVsbCkge1xuICAgICAgICBzY3JvbGxQYWdlKG5leHQsIG51bGwsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFzQ29udGVudEJleW9uZEZ1bGxQYWdlKCkpIHtcbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRzLnNjcm9sbEJleW9uZEZ1bGxwYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNDb250ZW50QmV5b25kRnVsbFBhZ2UoKSB7XG4gICAgICByZXR1cm4gZ2V0Q29udGFpbmVyKCkuc2Nyb2xsSGVpZ2h0IDwgJGJvZHkuc2Nyb2xsSGVpZ2h0ICYmIGdldE9wdGlvbnMoKS5zY3JvbGxCYXIgJiYgZ2V0T3B0aW9ucygpLnNjcm9sbEJleW9uZEZ1bGxwYWdlO1xuICAgIH1cblxuICAgIEZQLm1vdmVTZWN0aW9uVXAgPSBtb3ZlU2VjdGlvblVwO1xuICAgIC8qKlxuICAgICogTW92ZXMgdGhlIHBhZ2UgdXAgb25lIHNlY3Rpb24uXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIG1vdmVTZWN0aW9uVXAoKSB7XG4gICAgICB2YXIgcHJldiA9IGdldFN0YXRlKCkuYWN0aXZlU2VjdGlvbi5wcmV2KCk7IC8vbG9vcGluZyB0byB0aGUgYm90dG9tIGlmIHRoZXJlJ3Mgbm8gbW9yZSBzZWN0aW9ucyBhYm92ZVxuXG4gICAgICBpZiAoIXByZXYgJiYgKGdldE9wdGlvbnMoKS5sb29wVG9wIHx8IGdldE9wdGlvbnMoKS5jb250aW51b3VzVmVydGljYWwpKSB7XG4gICAgICAgIHByZXYgPSBnZXRMYXN0KGdldFN0YXRlKCkuc2VjdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldiAhPSBudWxsKSB7XG4gICAgICAgIHNjcm9sbFBhZ2UocHJldiwgbnVsbCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG9sZFBhZ2VZID0gMDtcbiAgICAvKipcbiAgICAqIERldGVjdGluZyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBtb3VzZSBtb3ZlbWVudC5cbiAgICAqIFVzZWQgb25seSBmb3IgdGhlIG1pZGRsZSBidXR0b24gb2YgdGhlIG1vdXNlLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBtb3VzZU1vdmVIYW5kbGVyKGUpIHtcbiAgICAgIGlmICghZ2V0T3B0aW9ucygpLmF1dG9TY3JvbGxpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUuY2FuU2Nyb2xsKSB7XG4gICAgICAgIC8vIG1vdmluZyB1cFxuICAgICAgICBpZiAoZS5wYWdlWSA8IG9sZFBhZ2VZICYmIGdldElzU2Nyb2xsQWxsb3dlZCgpLm0udXApIHtcbiAgICAgICAgICBtb3ZlU2VjdGlvblVwKCk7XG4gICAgICAgIH0gLy8gbW92aW5nIGRvd25cbiAgICAgICAgZWxzZSBpZiAoZS5wYWdlWSA+IG9sZFBhZ2VZICYmIGdldElzU2Nyb2xsQWxsb3dlZCgpLm0uZG93bikge1xuICAgICAgICAgIG1vdmVTZWN0aW9uRG93bigpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9sZFBhZ2VZID0gZS5wYWdlWTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0T2xkUGFnZVkodmFsdWUpIHtcbiAgICAgIG9sZFBhZ2VZID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBEZXRlcm1pbmVzIHRoZSB3YXkgb2Ygc2Nyb2xsaW5nIHVwIG9yIGRvd246XG4gICAgKiBieSAnYXV0b21hdGljYWxseScgc2Nyb2xsaW5nIGEgc2VjdGlvbiBvciBieSB1c2luZyB0aGUgZGVmYXVsdCBhbmQgbm9ybWFsIHNjcm9sbGluZy5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gc2Nyb2xsaW5nKHR5cGUpIHtcbiAgICAgIGlmICghZ2V0SXNTY3JvbGxBbGxvd2VkKCkubVt0eXBlXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBzY3JvbGxTZWN0aW9uID0gdHlwZSA9PT0gJ2Rvd24nID8gbW92ZVNlY3Rpb25Eb3duIDogbW92ZVNlY3Rpb25VcDtcblxuICAgICAgaWYgKGdldE9wdGlvbnMoKS5zY3JvbGxPdmVyZmxvdyAmJiBzY3JvbGxPdmVyZmxvd0hhbmRsZXIuaXNTY3JvbGxhYmxlKGdldFN0YXRlKCkuYWN0aXZlU2VjdGlvbikpIHtcbiAgICAgICAgLy9pcyB0aGUgc2Nyb2xsYmFyIGF0IHRoZSBzdGFydC9lbmQgb2YgdGhlIHNjcm9sbD9cbiAgICAgICAgaWYgKHNjcm9sbE92ZXJmbG93SGFuZGxlci5pc1Njcm9sbGVkKHR5cGUsIGdldFN0YXRlKCkuYWN0aXZlU2VjdGlvbi5pdGVtKSAmJiBzY3JvbGxPdmVyZmxvd0hhbmRsZXIuc2hvdWxkTW92ZVBhZ2UoKSkge1xuICAgICAgICAgIHNjcm9sbFNlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2Nyb2xsU2VjdGlvbigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0b3VjaFN0YXJ0WSA9IDA7XG4gICAgdmFyIHRvdWNoU3RhcnRYID0gMDtcbiAgICB2YXIgdG91Y2hFbmRZID0gMDtcbiAgICB2YXIgdG91Y2hFbmRYID0gMDtcbiAgICB2YXIgTVNQb2ludGVyID0gZ2V0TVNQb2ludGVyKCk7XG4gICAgdmFyIHBvaW50ZXJzID0ge1xuICAgICAgdG91Y2htb3ZlOiAnb250b3VjaG1vdmUnIGluIHdpbmRvdyA/ICd0b3VjaG1vdmUnIDogTVNQb2ludGVyID8gTVNQb2ludGVyLm1vdmUgOiBudWxsLFxuICAgICAgdG91Y2hzdGFydDogJ29udG91Y2hzdGFydCcgaW4gd2luZG93ID8gJ3RvdWNoc3RhcnQnIDogTVNQb2ludGVyID8gTVNQb2ludGVyLmRvd24gOiBudWxsXG4gICAgfTtcbiAgICAvKipcbiAgICAqIEFkZHMgdGhlIHBvc3NpYmlsaXR5IHRvIGF1dG8gc2Nyb2xsIHRocm91Z2ggc2VjdGlvbnMgb24gdG91Y2ggZGV2aWNlcy5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gYWRkVG91Y2hIYW5kbGVyKCkge1xuICAgICAgaWYgKCFwb2ludGVycy50b3VjaG1vdmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNUb3VjaERldmljZSB8fCBpc1RvdWNoKSB7XG4gICAgICAgIGlmIChnZXRPcHRpb25zKCkuYXV0b1Njcm9sbGluZykge1xuICAgICAgICAgICRib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIocG9pbnRlcnMudG91Y2htb3ZlLCBwcmV2ZW50Qm91bmNpbmcsIHtcbiAgICAgICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgJGJvZHkuYWRkRXZlbnRMaXN0ZW5lcihwb2ludGVycy50b3VjaG1vdmUsIHByZXZlbnRCb3VuY2luZywge1xuICAgICAgICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0b3VjaFdyYXBwZXIgPSBnZXRPcHRpb25zKCkudG91Y2hXcmFwcGVyO1xuICAgICAgICB0b3VjaFdyYXBwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihwb2ludGVycy50b3VjaHN0YXJ0LCB0b3VjaFN0YXJ0SGFuZGxlcik7XG4gICAgICAgIHRvdWNoV3JhcHBlci5yZW1vdmVFdmVudExpc3RlbmVyKHBvaW50ZXJzLnRvdWNobW92ZSwgdG91Y2hNb3ZlSGFuZGxlciwge1xuICAgICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICB0b3VjaFdyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcihwb2ludGVycy50b3VjaHN0YXJ0LCB0b3VjaFN0YXJ0SGFuZGxlcik7XG4gICAgICAgIHRvdWNoV3JhcHBlci5hZGRFdmVudExpc3RlbmVyKHBvaW50ZXJzLnRvdWNobW92ZSwgdG91Y2hNb3ZlSGFuZGxlciwge1xuICAgICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAqIFJlbW92ZXMgdGhlIGF1dG8gc2Nyb2xsaW5nIGZvciB0b3VjaCBkZXZpY2VzLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiByZW1vdmVUb3VjaEhhbmRsZXIoKSB7XG4gICAgICBpZiAoIXBvaW50ZXJzLnRvdWNobW92ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1RvdWNoRGV2aWNlIHx8IGlzVG91Y2gpIHtcbiAgICAgICAgLy8gbm9ybWFsU2Nyb2xsRWxlbWVudHMgcmVxdWlyZXMgaXQgb2ZmICMyNjkxXG4gICAgICAgIGlmIChnZXRPcHRpb25zKCkuYXV0b1Njcm9sbGluZykge1xuICAgICAgICAgICRib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIocG9pbnRlcnMudG91Y2htb3ZlLCB0b3VjaE1vdmVIYW5kbGVyLCB7XG4gICAgICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgICRib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIocG9pbnRlcnMudG91Y2htb3ZlLCBwcmV2ZW50Qm91bmNpbmcsIHtcbiAgICAgICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdG91Y2hXcmFwcGVyID0gZ2V0T3B0aW9ucygpLnRvdWNoV3JhcHBlcjtcbiAgICAgICAgdG91Y2hXcmFwcGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIocG9pbnRlcnMudG91Y2hzdGFydCwgdG91Y2hTdGFydEhhbmRsZXIpO1xuICAgICAgICB0b3VjaFdyYXBwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihwb2ludGVycy50b3VjaG1vdmUsIHRvdWNoTW92ZUhhbmRsZXIsIHtcbiAgICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyogRGV0ZWN0aW5nIHRvdWNoIGV2ZW50c1xuXG4gICAgKiBBcyB3ZSBhcmUgY2hhbmdpbmcgdGhlIHRvcCBwcm9wZXJ0eSBvZiB0aGUgcGFnZSBvbiBzY3JvbGxpbmcsIHdlIGNhbiBub3QgdXNlIHRoZSB0cmFkaXRpb25hbCB3YXkgdG8gZGV0ZWN0IGl0LlxuICAgICogVGhpcyB3YXksIHRoZSB0b3VjaHN0YXJ0IGFuZCB0aGUgdG91Y2ggbW92ZXMgc2hvd3MgYW4gc21hbGwgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0gd2hpY2ggaXMgdGhlXG4gICAgKiB1c2VkIG9uZSB0byBkZXRlcm1pbmUgdGhlIGRpcmVjdGlvbi5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gdG91Y2hNb3ZlSGFuZGxlcihlKSB7XG4gICAgICB2YXIgYWN0aXZlU2VjdGlvbiA9IGNsb3Nlc3QoZS50YXJnZXQsIFNFQ1RJT05fU0VMKSB8fCBnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb24uaXRlbTtcbiAgICAgIHZhciBoYXNBY3RpdmVTZWN0aW9uT3ZlcmZsb3cgPSBzY3JvbGxPdmVyZmxvd0hhbmRsZXIuaXNTY3JvbGxhYmxlKGdldFN0YXRlKCkuYWN0aXZlU2VjdGlvbik7XG5cbiAgICAgIGlmIChpc1JlYWxseVRvdWNoKGUpKSB7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBpc0dyYWJiaW5nOiB0cnVlLFxuICAgICAgICAgIGlzVXNpbmdXaGVlbDogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGdldE9wdGlvbnMoKS5hdXRvU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgaWYgKGhhc0FjdGl2ZVNlY3Rpb25PdmVyZmxvdyAmJiAhc3RhdGUuY2FuU2Nyb2xsIHx8IGdldE9wdGlvbnMoKS5zY3JvbGxCYXIpIHtcbiAgICAgICAgICAgIC8vcHJldmVudGluZyB0aGUgZWFzaW5nIG9uIGlPUyBkZXZpY2VzXG4gICAgICAgICAgICBwcmV2ZW50RGVmYXVsdChlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdG91Y2hFdmVudHMgPSBnZXRFdmVudHNQYWdlKGUpO1xuICAgICAgICB0b3VjaEVuZFkgPSB0b3VjaEV2ZW50cy55O1xuICAgICAgICB0b3VjaEVuZFggPSB0b3VjaEV2ZW50cy54O1xuICAgICAgICB2YXIgaXNWZXJ0aWNhbE1vdmVtZW50RW5vdWdoID0gTWF0aC5hYnModG91Y2hTdGFydFkgLSB0b3VjaEVuZFkpID4gd2luLmlubmVySGVpZ2h0IC8gMTAwICogZ2V0T3B0aW9ucygpLnRvdWNoU2Vuc2l0aXZpdHk7XG4gICAgICAgIHZhciBpc0hvcml6b250YWxNb3ZlbWVudEVub3VnaCA9IE1hdGguYWJzKHRvdWNoU3RhcnRYIC0gdG91Y2hFbmRYKSA+IGdldFdpbmRvd1dpZHRoKCkgLyAxMDAgKiBnZXRPcHRpb25zKCkudG91Y2hTZW5zaXRpdml0eTtcbiAgICAgICAgdmFyIGlzSG9yaXpvbnRhbFByZWRvbWluYW50TW92ZSA9ICQoU0xJREVTX1dSQVBQRVJfU0VMLCBhY3RpdmVTZWN0aW9uKS5sZW5ndGggJiYgTWF0aC5hYnModG91Y2hTdGFydFggLSB0b3VjaEVuZFgpID4gTWF0aC5hYnModG91Y2hTdGFydFkgLSB0b3VjaEVuZFkpO1xuICAgICAgICB2YXIgZGlyZWN0aW9uSCA9IHRvdWNoU3RhcnRYID4gdG91Y2hFbmRYID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgICAgICAgdmFyIGRpcmVjdGlvblYgPSB0b3VjaFN0YXJ0WSA+IHRvdWNoRW5kWSA/ICdkb3duJyA6ICd1cCc7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBpc0hvcml6b250YWxQcmVkb21pbmFudE1vdmUgPyBkaXJlY3Rpb25IIDogZGlyZWN0aW9uVjtcbiAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgIHRvdWNoRGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgICAgICAgfSk7IC8vaWYgbW92ZW1lbnQgaW4gdGhlIFggYXh5cyBpcyBncmVhdGVyIHRoYW4gaW4gdGhlIFkgYW5kIHRoZSBjdXJyZWN0IHNlY3Rpb24gaGFzIHNsaWRlcy4uLlxuXG4gICAgICAgIGlmIChpc0hvcml6b250YWxQcmVkb21pbmFudE1vdmUpIHtcbiAgICAgICAgICAvL2lzIHRoZSBtb3ZlbWVudCBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0gcmVzaXN0YW5jZSB0byBzY3JvbGw/XG4gICAgICAgICAgaWYgKCFzdGF0ZS5zbGlkZU1vdmluZyAmJiBpc0hvcml6b250YWxNb3ZlbWVudEVub3VnaCkge1xuICAgICAgICAgICAgaWYgKHRvdWNoU3RhcnRYID4gdG91Y2hFbmRYKSB7XG4gICAgICAgICAgICAgIGlmIChnZXRJc1Njcm9sbEFsbG93ZWQoKS5tLnJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRzLm1vdmVTbGlkZVJpZ2h0LCB7XG4gICAgICAgICAgICAgICAgICBzZWN0aW9uOiBhY3RpdmVTZWN0aW9uXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChnZXRJc1Njcm9sbEFsbG93ZWQoKS5tLmxlZnQpIHtcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdChldmVudHMubW92ZVNsaWRlTGVmdCwge1xuICAgICAgICAgICAgICAgICAgc2VjdGlvbjogYWN0aXZlU2VjdGlvblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vdmVydGljYWwgc2Nyb2xsaW5nIChvbmx5IHdoZW4gYXV0b1Njcm9sbGluZyBpcyBlbmFibGVkKVxuICAgICAgICBlbHNlIGlmIChnZXRPcHRpb25zKCkuYXV0b1Njcm9sbGluZyAmJiBzdGF0ZS5jYW5TY3JvbGwpIHtcbiAgICAgICAgICAvL2lzIHRoZSBtb3ZlbWVudCBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0gcmVzaXN0YW5jZSB0byBzY3JvbGw/XG4gICAgICAgICAgaWYgKGlzVmVydGljYWxNb3ZlbWVudEVub3VnaCkge1xuICAgICAgICAgICAgc2Nyb2xsaW5nKGRpcmVjdGlvblYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAqIEFzIElFID49IDEwIGZpcmVzIGJvdGggdG91Y2ggYW5kIG1vdXNlIGV2ZW50cyB3aGVuIHVzaW5nIGEgbW91c2UgaW4gYSB0b3VjaHNjcmVlblxuICAgICogdGhpcyB3YXkgd2UgbWFrZSBzdXJlIHRoYXQgaXMgcmVhbGx5IGEgdG91Y2ggZXZlbnQgd2hhdCBJRSBpcyBkZXRlY3RpbmcuXG4gICAgKi9cblxuXG4gICAgZnVuY3Rpb24gaXNSZWFsbHlUb3VjaChlKSB7XG4gICAgICAvL2lmIGlzIG5vdCBJRSAgIHx8ICBJRSBpcyBkZXRlY3RpbmcgYHRvdWNoYCBvciBgcGVuYFxuICAgICAgcmV0dXJuIHR5cGVvZiBlLnBvaW50ZXJUeXBlID09PSAndW5kZWZpbmVkJyB8fCBlLnBvaW50ZXJUeXBlICE9ICdtb3VzZSc7XG4gICAgfVxuICAgIC8qKlxuICAgICogSGFuZGxlciBmb3IgdGhlIHRvdWNoIHN0YXJ0IGV2ZW50LlxuICAgICovXG5cblxuICAgIGZ1bmN0aW9uIHRvdWNoU3RhcnRIYW5kbGVyKGUpIHtcbiAgICAgIC8vc3RvcHBpbmcgdGhlIGF1dG8gc2Nyb2xsIHRvIGFkanVzdCB0byBhIHNlY3Rpb25cbiAgICAgIGlmIChnZXRPcHRpb25zKCkuZml0VG9TZWN0aW9uKSB7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBhY3RpdmVBbmltYXRpb246IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZWFsbHlUb3VjaChlKSkge1xuICAgICAgICB2YXIgdG91Y2hFdmVudHMgPSBnZXRFdmVudHNQYWdlKGUpO1xuICAgICAgICB0b3VjaFN0YXJ0WSA9IHRvdWNoRXZlbnRzLnk7XG4gICAgICAgIHRvdWNoU3RhcnRYID0gdG91Y2hFdmVudHMueDtcbiAgICAgIH1cblxuICAgICAgd2luZG93QWRkRXZlbnQoJ3RvdWNoZW5kJywgdG91Y2hFbmRIYW5kbGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBIYW5kbGVyIGZvciB0aGUgdG91Y2ggZW5kIGV2ZW50LlxuICAgICovXG5cblxuICAgIGZ1bmN0aW9uIHRvdWNoRW5kSGFuZGxlcigpIHtcbiAgICAgIHdpbmRvd1JlbW92ZUV2ZW50KCd0b3VjaGVuZCcsIHRvdWNoRW5kSGFuZGxlcik7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGlzR3JhYmJpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBHZXRzIHRoZSBwYWdlWCBhbmQgcGFnZVkgcHJvcGVydGllcyBkZXBlbmRpbmcgb24gdGhlIGJyb3dzZXIuXG4gICAgKiBodHRwczovL2dpdGh1Yi5jb20vYWx2YXJvdHJpZ28vZnVsbFBhZ2UuanMvaXNzdWVzLzE5NCNpc3N1ZWNvbW1lbnQtMzQwNjk4NTRcbiAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBnZXRFdmVudHNQYWdlKGUpIHtcbiAgICAgIHZhciBldmVudHMgPSB7fTtcbiAgICAgIGV2ZW50cy55ID0gdHlwZW9mIGUucGFnZVkgIT09ICd1bmRlZmluZWQnICYmIChlLnBhZ2VZIHx8IGUucGFnZVgpID8gZS5wYWdlWSA6IGUudG91Y2hlc1swXS5wYWdlWTtcbiAgICAgIGV2ZW50cy54ID0gdHlwZW9mIGUucGFnZVggIT09ICd1bmRlZmluZWQnICYmIChlLnBhZ2VZIHx8IGUucGFnZVgpID8gZS5wYWdlWCA6IGUudG91Y2hlc1swXS5wYWdlWDsgLy9pbiB0b3VjaCBkZXZpY2VzIHdpdGggc2Nyb2xsQmFyOnRydWUsIGUucGFnZVkgaXMgZGV0ZWN0ZWQsIGJ1dCB3ZSBoYXZlIHRvIGRlYWwgd2l0aCB0b3VjaCBldmVudHMuICMxMDA4XG5cbiAgICAgIGlmIChpc1RvdWNoICYmIGlzUmVhbGx5VG91Y2goZSkgJiYgZ2V0T3B0aW9ucygpLnNjcm9sbEJhciAmJiB0eXBlb2YgZS50b3VjaGVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBldmVudHMueSA9IGUudG91Y2hlc1swXS5wYWdlWTtcbiAgICAgICAgZXZlbnRzLnggPSBlLnRvdWNoZXNbMF0ucGFnZVg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBldmVudHM7XG4gICAgfVxuICAgIC8qXG4gICAgKiBSZXR1cm5zIGFuZCBvYmplY3Qgd2l0aCBNaWNyb3NvZnQgcG9pbnRlcnMgKGZvciBJRTwxMSBhbmQgZm9yIElFID49IDExKVxuICAgICogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2RuMzA0ODg2KHY9dnMuODUpLmFzcHhcbiAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBnZXRNU1BvaW50ZXIoKSB7XG4gICAgICB2YXIgcG9pbnRlcjsgLy9JRSA+PSAxMSAmIHJlc3Qgb2YgYnJvd3NlcnNcblxuICAgICAgaWYgKHdpbi5Qb2ludGVyRXZlbnQpIHtcbiAgICAgICAgcG9pbnRlciA9IHtcbiAgICAgICAgICBkb3duOiAncG9pbnRlcmRvd24nLFxuICAgICAgICAgIG1vdmU6ICdwb2ludGVybW92ZSdcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBvaW50ZXI7XG4gICAgfVxuICAgIC8qXG4gICAgKiBQcmV2ZW50aW5nIGJvdW5jaW5nIGluIGlPUyAjMjI4NVxuICAgICovXG5cblxuICAgIGZ1bmN0aW9uIHByZXZlbnRCb3VuY2luZyhlKSB7XG4gICAgICBpZiAoZ2V0T3B0aW9ucygpLmF1dG9TY3JvbGxpbmcgJiYgaXNSZWFsbHlUb3VjaChlKSAmJiBnZXRJc1Njcm9sbEFsbG93ZWQoKS5tLnVwKSB7XG4gICAgICAgIC8vcHJldmVudGluZyB0aGUgZWFzaW5nIG9uIGlPUyBkZXZpY2VzXG4gICAgICAgIGlmICghc3RhdGUuY2FuU2Nyb2xsKSB7XG4gICAgICAgICAgcHJldmVudERlZmF1bHQoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBGUC5tb3ZlU2xpZGVMZWZ0ID0gbW92ZVNsaWRlTGVmdDtcbiAgICBGUC5tb3ZlU2xpZGVSaWdodCA9IG1vdmVTbGlkZVJpZ2h0O1xuICAgIC8qKlxuICAgICogU2xpZGVzIGEgc2xpZGVyIHRvIHRoZSBnaXZlbiBkaXJlY3Rpb24uXG4gICAgKiBPcHRpb25hbCBgc2VjdGlvbmAgcGFyYW0uXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIG1vdmVTbGlkZShkaXJlY3Rpb24sIHNlY3Rpb24pIHtcbiAgICAgIHZhciBhY3RpdmVTZWN0aW9uSXRlbSA9IHNlY3Rpb24gPT0gbnVsbCA/IGdldFN0YXRlKCkuYWN0aXZlU2VjdGlvbi5pdGVtIDogc2VjdGlvbjtcbiAgICAgIHZhciBhY3RpdmVTZWN0aW9uID0gZ2V0UGFuZWxCeUVsZW1lbnQoc3RhdGUuc2VjdGlvbnMsIGFjdGl2ZVNlY3Rpb25JdGVtKTtcbiAgICAgIHZhciBzbGlkZXMgPSAkKFNMSURFU19XUkFQUEVSX1NFTCwgYWN0aXZlU2VjdGlvbkl0ZW0pWzBdOyAvLyBtb3JlIHRoYW4gb25lIHNsaWRlIG5lZWRlZCBhbmQgbm90aGluZyBzaG91bGQgYmUgc2xpZGluZ1xuXG4gICAgICBpZiAoc2xpZGVzID09IG51bGwgfHwgc3RhdGUuc2xpZGVNb3ZpbmcgfHwgYWN0aXZlU2VjdGlvbi5zbGlkZXMubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBjdXJyZW50U2xpZGUgPSBhY3RpdmVTZWN0aW9uLmFjdGl2ZVNsaWRlO1xuICAgICAgdmFyIGRlc3RpbnkgPSBkaXJlY3Rpb24gPT09ICdsZWZ0JyA/IGN1cnJlbnRTbGlkZS5wcmV2KCkgOiBjdXJyZW50U2xpZGUubmV4dCgpOyAvL2lzbid0IHRoZXJlIGEgbmV4dCBzbGlkZSBpbiB0aGUgc2VjdWVuY2U/XG5cbiAgICAgIGlmICghZGVzdGlueSkge1xuICAgICAgICAvL3Jlc3BlY3QgbG9vcEhvcml6b250YWwgc2V0dGluZ1xuICAgICAgICBpZiAoIWdldE9wdGlvbnMoKS5sb29wSG9yaXpvbnRhbCkgcmV0dXJuO1xuICAgICAgICBkZXN0aW55ID0gZGlyZWN0aW9uID09PSAnbGVmdCcgPyBnZXRMYXN0KGFjdGl2ZVNlY3Rpb24uc2xpZGVzKSA6IGFjdGl2ZVNlY3Rpb24uc2xpZGVzWzBdO1xuICAgICAgfVxuXG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIHNsaWRlTW92aW5nOiAhRlAudGVzdC5pc1Rlc3RpbmdcbiAgICAgIH0pO1xuICAgICAgbGFuZHNjYXBlU2Nyb2xsKHNsaWRlcywgZGVzdGlueS5pdGVtLCBkaXJlY3Rpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAqIFNsaWRlcyBsZWZ0IHRoZSBzbGlkZXIgb2YgdGhlIGFjdGl2ZSBzZWN0aW9uLlxuICAgICogT3B0aW9uYWwgYHNlY3Rpb25gIHBhcmFtLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBtb3ZlU2xpZGVMZWZ0KHNlY3Rpb24pIHtcbiAgICAgIG1vdmVTbGlkZSgnbGVmdCcsIHNlY3Rpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAqIFNsaWRlcyByaWdodCB0aGUgc2xpZGVyIG9mIHRoZSBhY3RpdmUgc2VjdGlvbi5cbiAgICAqIE9wdGlvbmFsIGBzZWN0aW9uYCBwYXJhbS5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gbW92ZVNsaWRlUmlnaHQoc2VjdGlvbikge1xuICAgICAgbW92ZVNsaWRlKCdyaWdodCcsIHNlY3Rpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogR2V0cyBhIHNlY3Rpb24gYnkgaXRzIGFuY2hvciAvIGluZGV4XG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIGdldFNlY3Rpb25CeUFuY2hvcihzZWN0aW9uQW5jaG9yKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IGdldFN0YXRlKCkuc2VjdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChzZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBzZWN0aW9uLmFuY2hvciA9PT0gc2VjdGlvbkFuY2hvcjtcbiAgICAgIH0pWzBdO1xuXG4gICAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgICAgdmFyIHNlY3Rpb25JbmRleCA9IHR5cGVvZiBzZWN0aW9uQW5jaG9yICE9PSAndW5kZWZpbmVkJyA/IHNlY3Rpb25BbmNob3IgLSAxIDogMDtcbiAgICAgICAgc2VjdGlvbiA9IGdldFN0YXRlKCkuc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlY3Rpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBTY3JvbGxzIHRoZSBzbGlkZXIgdG8gdGhlIGdpdmVuIHNsaWRlIGRlc3RpbmF0aW9uIGZvciB0aGUgZ2l2ZW4gc2VjdGlvblxuICAgICovXG5cbiAgICBmdW5jdGlvbiBzY3JvbGxTbGlkZXIoc2xpZGVFbGVtKSB7XG4gICAgICBpZiAoc2xpZGVFbGVtICE9IG51bGwpIHtcbiAgICAgICAgbGFuZHNjYXBlU2Nyb2xsKGNsb3Nlc3Qoc2xpZGVFbGVtLCBTTElERVNfV1JBUFBFUl9TRUwpLCBzbGlkZUVsZW0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogU2Nyb2xscyB0byB0aGUgZ2l2ZW4gc2VjdGlvbiBhbmQgc2xpZGUgYW5jaG9yc1xuICAgICovXG5cbiAgICBmdW5jdGlvbiBzY3JvbGxQYWdlQW5kU2xpZGUoc2VjdGlvbkFuY2hvciwgc2xpZGVBbmNob3IpIHtcbiAgICAgIHZhciBzZWN0aW9uID0gZ2V0U2VjdGlvbkJ5QW5jaG9yKHNlY3Rpb25BbmNob3IpOyAvL2RvIG5vdGhpbmcgaWYgdGhlcmUncyBubyBzZWN0aW9uIHdpdGggdGhlIGdpdmVuIGFuY2hvciBuYW1lXG5cbiAgICAgIGlmIChzZWN0aW9uID09IG51bGwpIHJldHVybjtcbiAgICAgIHZhciBzbGlkZUVsZW0gPSBnZXRTbGlkZUJ5QW5jaG9yKHNsaWRlQW5jaG9yLCBzZWN0aW9uKTsgLy93ZSBuZWVkIHRvIHNjcm9sbCB0byB0aGUgc2VjdGlvbiBhbmQgdGhlbiB0byB0aGUgc2xpZGVcblxuICAgICAgaWYgKCghc2VjdGlvbi5hbmNob3IgfHwgc2VjdGlvbi5hbmNob3IgIT09IHN0YXRlLmxhc3RTY3JvbGxlZERlc3RpbnkpICYmICFoYXNDbGFzcyhzZWN0aW9uLml0ZW0sIEFDVElWRSkpIHtcbiAgICAgICAgc2Nyb2xsUGFnZShzZWN0aW9uLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2Nyb2xsU2xpZGVyKHNsaWRlRWxlbSk7XG4gICAgICAgIH0pO1xuICAgICAgfSAvL2lmIHdlIHdlcmUgYWxyZWFkeSBpbiB0aGUgc2VjdGlvblxuICAgICAgZWxzZSB7XG4gICAgICAgIHNjcm9sbFNsaWRlcihzbGlkZUVsZW0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAqIEdldHMgYSBzbGlkZSBpbnNpZGUgYSBnaXZlbiBzZWN0aW9uIGJ5IGl0cyBhbmNob3IgLyBpbmRleFxuICAgICovXG5cbiAgICBmdW5jdGlvbiBnZXRTbGlkZUJ5QW5jaG9yKHNsaWRlQW5jaG9yLCBzZWN0aW9uKSB7XG4gICAgICB2YXIgc2xpZGUgPSBzZWN0aW9uLnNsaWRlcy5maWx0ZXIoZnVuY3Rpb24gKHNsaWRlKSB7XG4gICAgICAgIHJldHVybiBzbGlkZS5hbmNob3IgPT09IHNsaWRlQW5jaG9yO1xuICAgICAgfSlbMF07XG5cbiAgICAgIGlmIChzbGlkZSA9PSBudWxsKSB7XG4gICAgICAgIHNsaWRlQW5jaG9yID0gdHlwZW9mIHNsaWRlQW5jaG9yICE9PSAndW5kZWZpbmVkJyA/IHNsaWRlQW5jaG9yIDogMDtcbiAgICAgICAgc2xpZGUgPSBzZWN0aW9uLnNsaWRlc1tzbGlkZUFuY2hvcl07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzbGlkZSA/IHNsaWRlLml0ZW0gOiBudWxsO1xuICAgIH1cblxuICAgIEZQLm1vdmVUbyA9IG1vdmVUbyQxO1xuICAgIC8qKlxuICAgICogTW92ZXMgdGhlIHBhZ2UgdG8gdGhlIGdpdmVuIHNlY3Rpb24gYW5kIHNsaWRlLlxuICAgICogQW5jaG9ycyBvciBpbmRleCBwb3NpdGlvbnMgY2FuIGJlIHVzZWQgYXMgcGFyYW1zLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBtb3ZlVG8kMShzZWN0aW9uQW5jaG9yLCBzbGlkZUFuY2hvcikge1xuICAgICAgdmFyIGRlc3RpbnkgPSBnZXRTZWN0aW9uQnlBbmNob3Ioc2VjdGlvbkFuY2hvcik7XG5cbiAgICAgIGlmICh0eXBlb2Ygc2xpZGVBbmNob3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNjcm9sbFBhZ2VBbmRTbGlkZShzZWN0aW9uQW5jaG9yLCBzbGlkZUFuY2hvcik7XG4gICAgICB9IGVsc2UgaWYgKGRlc3RpbnkgIT0gbnVsbCkge1xuICAgICAgICBzY3JvbGxQYWdlKGRlc3RpbnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vQHRzLWNoZWNrXG4gICAgdmFyIGdfY29udHJvbFByZXNzZWQ7XG4gICAgdmFyIGdfa2V5ZG93bklkO1xuICAgIHZhciBnX2VsVG9Gb2N1cztcbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRzLmJpbmRFdmVudHMsIGJpbmRFdmVudHMkOCk7XG5cbiAgICBmdW5jdGlvbiBiaW5kRXZlbnRzJDgoKSB7XG4gICAgICAvL3doZW4gb3BlbmluZyBhIG5ldyB0YWIgKGN0cmwgKyB0KSwgYGNvbnRyb2xgIHdvbid0IGJlIHByZXNzZWQgd2hlbiBjb21pbmcgYmFjay5cbiAgICAgIHdpbmRvd0FkZEV2ZW50KCdibHVyJywgYmx1ckhhbmRsZXIpOyAvL1NsaWRpbmcgd2l0aCBhcnJvdyBrZXlzLCBib3RoLCB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbFxuXG4gICAgICBkb2NBZGRFdmVudCgna2V5ZG93bicsIGtleWRvd25IYW5kbGVyKTsgLy90byBwcmV2ZW50IHNjcm9sbGluZyB3aGlsZSB6b29taW5nXG5cbiAgICAgIGRvY0FkZEV2ZW50KCdrZXl1cCcsIGtleVVwSGFuZGxlcik7XG4gICAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRzLm9uRGVzdHJveSwgb25EZXN0cm95JDUpO1xuICAgICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50cy5hZnRlclNsaWRlTG9hZHMsIG9uQWZ0ZXJTbGlkZUxvYWRzKTtcbiAgICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMuYWZ0ZXJTZWN0aW9uTG9hZHMsIGFmdGVyU2VjdGlvbkxvYWRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkRlc3Ryb3kkNSgpIHtcbiAgICAgIGNsZWFyVGltZW91dChnX2tleWRvd25JZCk7XG4gICAgICBkb2NSZW1vdmVFdmVudCgna2V5ZG93bicsIGtleWRvd25IYW5kbGVyKTtcbiAgICAgIGRvY1JlbW92ZUV2ZW50KCdrZXl1cCcsIGtleVVwSGFuZGxlcik7XG4gICAgfSAvL1NsaWRpbmcgd2l0aCBhcnJvdyBrZXlzLCBib3RoLCB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbFxuXG5cbiAgICBmdW5jdGlvbiBrZXlkb3duSGFuZGxlcihlKSB7XG4gICAgICBjbGVhclRpbWVvdXQoZ19rZXlkb3duSWQpO1xuICAgICAgdmFyIGtleUNvZGUgPSBlLmtleUNvZGU7XG4gICAgICB2YXIgaXNQcmVzc2luZ0hvcml6b250YWxBcnJvd3MgPSBbMzcsIDM5XS5pbmRleE9mKGtleUNvZGUpID4gLTE7XG4gICAgICB2YXIgY2FuU2Nyb2xsV2l0aEtleWJvYXJkID0gZ2V0T3B0aW9ucygpLmF1dG9TY3JvbGxpbmcgfHwgZ2V0T3B0aW9ucygpLmZpdFRvU2VjdGlvbiB8fCBpc1ByZXNzaW5nSG9yaXpvbnRhbEFycm93czsgLy90YWI/XG5cbiAgICAgIGlmIChrZXlDb2RlID09PSA5KSB7XG4gICAgICAgIG9uVGFiKGUpO1xuICAgICAgfSBlbHNlIGlmICghaXNJbnNpZGVJbnB1dCgpICYmIGdldE9wdGlvbnMoKS5rZXlib2FyZFNjcm9sbGluZyAmJiBjYW5TY3JvbGxXaXRoS2V5Ym9hcmQpIHtcbiAgICAgICAgZ19jb250cm9sUHJlc3NlZCA9IGUuY3RybEtleTtcbiAgICAgICAgZ19rZXlkb3duSWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBvbmtleWRvd24oZSk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAqIEtleWRvd24gZXZlbnRcbiAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBvbmtleWRvd24oZSkge1xuICAgICAgdmFyIHNoaWZ0UHJlc3NlZCA9IGUuc2hpZnRLZXk7XG4gICAgICB2YXIgYWN0aXZlRWxlbWVudCA9IGRvYy5hY3RpdmVFbGVtZW50O1xuICAgICAgdmFyIGlzTWVkaWFGb2N1c2VkID0gbWF0Y2hlcyhhY3RpdmVFbGVtZW50LCAndmlkZW8nKSB8fCBtYXRjaGVzKGFjdGl2ZUVsZW1lbnQsICdhdWRpbycpO1xuICAgICAgdmFyIGlzU2Nyb2xsZWQgPSB7XG4gICAgICAgIHVwOiBzY3JvbGxPdmVyZmxvd0hhbmRsZXIuaXNTY3JvbGxlZCgndXAnLCBnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb24uaXRlbSksXG4gICAgICAgIGRvd246IHNjcm9sbE92ZXJmbG93SGFuZGxlci5pc1Njcm9sbGVkKCdkb3duJywgZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uLml0ZW0pXG4gICAgICB9O1xuICAgICAgdmFyIGlzVXNpbmdIb3Jpem9udGFsQXJyb3dLZXlzID0gWzM3LCAzOV0uaW5kZXhPZihlLmtleUNvZGUpID4gLTE7XG4gICAgICBjYW5jZWxEaXJlY3Rpb25LZXlFdmVudHMoZSk7IC8vZG8gbm90aGluZyBpZiB3ZSBjYW4gbm90IHNjcm9sbCBvciB3ZSBhcmUgbm90IHVzaW5nIGhvcml6b3RuYWwga2V5IGFycm93cy5cblxuICAgICAgaWYgKCFzdGF0ZS5jYW5TY3JvbGwgJiYgIWlzVXNpbmdIb3Jpem9udGFsQXJyb3dLZXlzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxUcmlnZ2VyOiAna2V5ZG93bidcbiAgICAgIH0pO1xuXG4gICAgICBzd2l0Y2ggKGUua2V5Q29kZSkge1xuICAgICAgICAvL3VwXG4gICAgICAgIGNhc2UgMzg6XG4gICAgICAgIGNhc2UgMzM6XG4gICAgICAgICAgaWYgKGdldElzU2Nyb2xsQWxsb3dlZCgpLmsudXAgJiYgaXNTY3JvbGxlZC51cCkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmlzQmV5b25kRnVsbHBhZ2UpIHtcbiAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRzLm9uS2V5RG93biwge1xuICAgICAgICAgICAgICAgIGU6IGVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtb3ZlU2VjdGlvblVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjcm9sbE92ZXJmbG93SGFuZGxlci5mb2N1c1Njcm9sbGFibGUoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy9kb3duXG5cbiAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAvL3NwYWNlYmFyXG4gICAgICAgICAgaWYgKHNoaWZ0UHJlc3NlZCAmJiBnZXRJc1Njcm9sbEFsbG93ZWQoKS5rLnVwICYmICFpc01lZGlhRm9jdXNlZCAmJiBpc1Njcm9sbGVkLnVwKSB7XG4gICAgICAgICAgICBtb3ZlU2VjdGlvblVwKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgICAgIGNhc2UgNDA6XG4gICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgaWYgKGdldElzU2Nyb2xsQWxsb3dlZCgpLmsuZG93biAmJiBpc1Njcm9sbGVkLmRvd24pIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5pc0JleW9uZEZ1bGxwYWdlKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gLy8gc3BhY2UgYmFyP1xuXG5cbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgIT09IDMyIHx8ICFpc01lZGlhRm9jdXNlZCkge1xuICAgICAgICAgICAgICBtb3ZlU2VjdGlvbkRvd24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2Nyb2xsT3ZlcmZsb3dIYW5kbGVyLmZvY3VzU2Nyb2xsYWJsZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvL0hvbWVcblxuICAgICAgICBjYXNlIDM2OlxuICAgICAgICAgIGlmIChnZXRJc1Njcm9sbEFsbG93ZWQoKS5rLnVwKSB7XG4gICAgICAgICAgICBtb3ZlVG8kMSgxKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy9FbmRcblxuICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgIGlmIChnZXRJc1Njcm9sbEFsbG93ZWQoKS5rLmRvd24pIHtcbiAgICAgICAgICAgIG1vdmVUbyQxKGdldFN0YXRlKCkuc2VjdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy9sZWZ0XG5cbiAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgICBpZiAoZ2V0SXNTY3JvbGxBbGxvd2VkKCkuay5sZWZ0KSB7XG4gICAgICAgICAgICBtb3ZlU2xpZGVMZWZ0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vcmlnaHRcblxuICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgIGlmIChnZXRJc1Njcm9sbEFsbG93ZWQoKS5rLnJpZ2h0KSB7XG4gICAgICAgICAgICBtb3ZlU2xpZGVSaWdodCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyBleGl0IHRoaXMgaGFuZGxlciBmb3Igb3RoZXIga2V5c1xuICAgICAgfVxuICAgIH0gLy90byBwcmV2ZW50IHNjcm9sbGluZyB3aGlsZSB6b29taW5nXG5cblxuICAgIGZ1bmN0aW9uIGtleVVwSGFuZGxlcihlKSB7XG4gICAgICBpZiAoc3RhdGUuaXNXaW5kb3dGb2N1c2VkKSB7XG4gICAgICAgIC8vdGhlIGtleXVwIGdldHMgZmlyZWQgb24gbmV3IHRhYiBjdHJsICsgdCBpbiBGaXJlZm94XG4gICAgICAgIGdfY29udHJvbFByZXNzZWQgPSBlLmN0cmxLZXk7XG4gICAgICB9XG4gICAgfSAvL3doZW4gb3BlbmluZyBhIG5ldyB0YWIgKGN0cmwgKyB0KSwgYGNvbnRyb2xgIHdvbid0IGJlIHByZXNzZWQgd2hlbiBjb21pbmcgYmFjay5cblxuXG4gICAgZnVuY3Rpb24gYmx1ckhhbmRsZXIoKSB7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGlzV2luZG93Rm9jdXNlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgZ19jb250cm9sUHJlc3NlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAqIE1ha2VzIHN1cmUgdGhlIHRhYiBrZXkgd2lsbCBvbmx5IGZvY3VzIGVsZW1lbnRzIHdpdGhpbiB0aGUgY3VycmVudCBzZWN0aW9uL3NsaWRlXG4gICAgKiBwcmV2ZW50aW5nIHRoaXMgd2F5IGZyb20gYnJlYWtpbmcgdGhlIHBhZ2UuXG4gICAgKiBCYXNlZCBvbiBcIk1vZGFscyBhbmQga2V5Ym9hcmQgdHJhcHNcIlxuICAgICogZnJvbSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvZnVuZGFtZW50YWxzL2FjY2Vzc2liaWxpdHkvZm9jdXMvdXNpbmctdGFiaW5kZXhcbiAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBvblRhYihlKSB7XG4gICAgICB2YXIgaXNTaGlmdFByZXNzZWQgPSBlLnNoaWZ0S2V5O1xuICAgICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSBkb2MuYWN0aXZlRWxlbWVudDtcbiAgICAgIHZhciBmb2N1c2FibGVFbGVtZW50cyA9IGdldEZvY3VzYWJsZXMoZ2V0U2xpZGVPclNlY3Rpb24oZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uLml0ZW0pKTtcblxuICAgICAgZnVuY3Rpb24gcHJldmVudEFuZEZvY3VzRmlyc3QoZSkge1xuICAgICAgICBwcmV2ZW50RGVmYXVsdChlKTtcbiAgICAgICAgcmV0dXJuIGZvY3VzYWJsZUVsZW1lbnRzWzBdID8gZm9jdXNhYmxlRWxlbWVudHNbMF0uZm9jdXMoKSA6IG51bGw7XG4gICAgICB9IC8vIGRlYWN0aXZhdGluZyB0YWIgd2hpbGUgc2Nyb2xsaW5nICM0NTUwXG5cblxuICAgICAgaWYgKCFzdGF0ZS5jYW5TY3JvbGwpIHtcbiAgICAgICAgcHJldmVudERlZmF1bHQoZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy9vdXRzaWRlIGFueSBzZWN0aW9uIG9yIHNsaWRlPyBMZXQncyBub3QgaGlqYWNrIHRoZSB0YWIhXG5cblxuICAgICAgaWYgKGlzRm9jdXNPdXRzaWRlKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy9pcyB0aGVyZSBhbiBlbGVtZW50IHdpdGggZm9jdXM/XG5cblxuICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGNsb3Nlc3QoYWN0aXZlRWxlbWVudCwgU0VDVElPTl9BQ1RJVkVfU0VMICsgJywnICsgU0VDVElPTl9BQ1RJVkVfU0VMICsgJyAnICsgU0xJREVfQUNUSVZFX1NFTCkgPT0gbnVsbCkge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnQgPSBwcmV2ZW50QW5kRm9jdXNGaXJzdChlKTtcbiAgICAgICAgfVxuICAgICAgfSAvL25vIGVsZW1lbnQgaWYgZm9jdXNlZD8gTGV0J3MgZm9jdXMgdGhlIGZpcnN0IG9uZSBvZiB0aGUgc2VjdGlvbi9zbGlkZVxuICAgICAgZWxzZSB7XG4gICAgICAgIHByZXZlbnRBbmRGb2N1c0ZpcnN0KGUpO1xuICAgICAgfSAvL3doZW4gcmVhY2hlZCB0aGUgZmlyc3Qgb3IgbGFzdCBmb2N1c2FibGUgZWxlbWVudCBvZiB0aGUgc2VjdGlvbi9zbGlkZVxuICAgICAgLy93ZSBwcmV2ZW50IHRoZSB0YWIgYWN0aW9uIHRvIGtlZXAgaXQgaW4gdGhlIGxhc3QgZm9jdXNhYmxlIGVsZW1lbnRcblxuXG4gICAgICB2YXIgaXNGaXJzdEZvY3VzYWJsZUluU2VjdGlvbiA9IGFjdGl2ZUVsZW1lbnQgPT0gZm9jdXNhYmxlRWxlbWVudHNbMF07XG4gICAgICB2YXIgaXNMYXN0Rm9jdXNhYmxlSW5TZWN0aW9uID0gYWN0aXZlRWxlbWVudCA9PSBmb2N1c2FibGVFbGVtZW50c1tmb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgIHZhciBpc05leHRJdGVtID0gIWlzU2hpZnRQcmVzc2VkICYmIGlzTGFzdEZvY3VzYWJsZUluU2VjdGlvbjtcbiAgICAgIHZhciBpc1ByZXZJdGVtID0gaXNTaGlmdFByZXNzZWQgJiYgaXNGaXJzdEZvY3VzYWJsZUluU2VjdGlvbjtcblxuICAgICAgaWYgKGlzUHJldkl0ZW0gfHwgaXNOZXh0SXRlbSkge1xuICAgICAgICBwcmV2ZW50RGVmYXVsdChlKTtcbiAgICAgICAgdmFyIGZvY3VzSW5mbyA9IGdldFBhbmVsV2l0aEZvY3VzYWJsZShpc1ByZXZJdGVtKTtcbiAgICAgICAgdmFyIGRlc3RpbmF0aW9uUGFuZWwgPSBmb2N1c0luZm8gPyBmb2N1c0luZm8ucGFuZWwgOiBudWxsO1xuXG4gICAgICAgIGlmIChkZXN0aW5hdGlvblBhbmVsKSB7XG4gICAgICAgICAgdmFyIGRlc3RpbmF0aW9uU2VjdGlvbiA9IGRlc3RpbmF0aW9uUGFuZWwuaXNTZWN0aW9uID8gZGVzdGluYXRpb25QYW5lbCA6IGRlc3RpbmF0aW9uUGFuZWwucGFyZW50O1xuICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50cy5vblNjcm9sbFBhZ2VBbmRTbGlkZSwge1xuICAgICAgICAgICAgc2VjdGlvbkFuY2hvcjogZGVzdGluYXRpb25TZWN0aW9uLmluZGV4KCkgKyAxLFxuICAgICAgICAgICAgc2xpZGVBbmNob3I6IGRlc3RpbmF0aW9uUGFuZWwuaXNTZWN0aW9uID8gMCA6IGRlc3RpbmF0aW9uUGFuZWwuaW5kZXgoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGdfZWxUb0ZvY3VzID0gZm9jdXNJbmZvLml0ZW1Ub0ZvY3VzO1xuICAgICAgICAgIHByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25BZnRlclNsaWRlTG9hZHModikge1xuICAgICAgZm9jdXNJdGVtKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWZ0ZXJTZWN0aW9uTG9hZHModikge1xuICAgICAgaWYgKCFjbG9zZXN0KGdfZWxUb0ZvY3VzLCBTTElERV9TRUwpIHx8IGNsb3Nlc3QoZ19lbFRvRm9jdXMsIFNMSURFX0FDVElWRV9TRUwpKSB7XG4gICAgICAgIGZvY3VzSXRlbSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZvY3VzSXRlbSgpIHtcbiAgICAgIGlmIChnX2VsVG9Gb2N1cykge1xuICAgICAgICBnX2VsVG9Gb2N1cy5mb2N1cygpO1xuICAgICAgICBnX2VsVG9Gb2N1cyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCdzIHRoZSBwYW5lbCBjb250YWluaW5nIHRoZSBlbGVtZW50IHRvIGZvY3VzLlxuICAgICAqXG4gICAgICovXG5cblxuICAgIGZ1bmN0aW9uIGdldFBhbmVsV2l0aEZvY3VzYWJsZShpc1ByZXZJdGVtKSB7XG4gICAgICB2YXIgYWN0aW9uID0gaXNQcmV2SXRlbSA/ICdwcmV2UGFuZWwnIDogJ25leHRQYW5lbCc7XG4gICAgICB2YXIgZm9jdXNhYmxlRWxlbWVudHMgPSBbXTtcbiAgICAgIHZhciBwYW5lbFdpdGhGb2N1c2FibGVzO1xuICAgICAgdmFyIGN1cnJlbnRQYW5lbCA9IGdldFNsaWRlT3JTZWN0aW9uUGFuZWwoZ2V0QWN0aXZlUGFuZWwoKVthY3Rpb25dKCkpO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGZvY3VzYWJsZUVsZW1lbnRzID0gZ2V0Rm9jdXNhYmxlcyhjdXJyZW50UGFuZWwuaXRlbSk7XG5cbiAgICAgICAgaWYgKGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIHBhbmVsV2l0aEZvY3VzYWJsZXMgPSB7XG4gICAgICAgICAgICBwYW5lbDogY3VycmVudFBhbmVsLFxuICAgICAgICAgICAgaXRlbVRvRm9jdXM6IGZvY3VzYWJsZUVsZW1lbnRzW2lzUHJldkl0ZW0gPyBmb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxIDogMF1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFBhbmVsID0gZ2V0U2xpZGVPclNlY3Rpb25QYW5lbChjdXJyZW50UGFuZWxbYWN0aW9uXSgpKTtcbiAgICAgIH0gd2hpbGUgKGN1cnJlbnRQYW5lbCAmJiBmb2N1c2FibGVFbGVtZW50cy5sZW5ndGggPT09IDApO1xuXG4gICAgICByZXR1cm4gcGFuZWxXaXRoRm9jdXNhYmxlcztcbiAgICB9XG4gICAgLyoqXG4gICAgKiBHZXRzIGFsbCB0aGUgZm9jdXNhYmxlIGVsZW1lbnRzIGluc2lkZSB0aGUgcGFzc2VkIGVsZW1lbnQuXG4gICAgKi9cblxuXG4gICAgZnVuY3Rpb24gZ2V0Rm9jdXNhYmxlcyhlbCkge1xuICAgICAgcmV0dXJuIFtdLnNsaWNlLmNhbGwoJChmb2N1c2FibGVFbGVtZW50c1N0cmluZywgZWwpKS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGdldEF0dHIoaXRlbSwgJ3RhYmluZGV4JykgIT09ICctMScgJiYgLy9hcmUgYWxzbyBub3QgaGlkZGVuIGVsZW1lbnRzIChvciB3aXRoIGhpZGRlbiBwYXJlbnRzKVxuICAgICAgICBpdGVtLm9mZnNldFBhcmVudCAhPT0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZm9jdXMgaXMgb3V0c2lkZSBmdWxscGFnZS5qcyBzZWN0aW9ucy9zbGlkZXMgb3Igbm90LlxuICAgICovXG5cblxuICAgIGZ1bmN0aW9uIGlzRm9jdXNPdXRzaWRlKGUpIHtcbiAgICAgIHZhciBhbGxGb2N1c2FibGVzID0gZ2V0Rm9jdXNhYmxlcyhkb2MpO1xuICAgICAgdmFyIGN1cnJlbnRGb2N1c0luZGV4ID0gYWxsRm9jdXNhYmxlcy5pbmRleE9mKGRvYy5hY3RpdmVFbGVtZW50KTtcbiAgICAgIHZhciBmb2N1c0Rlc3RpbmF0aW9uSW5kZXggPSBlLnNoaWZ0S2V5ID8gY3VycmVudEZvY3VzSW5kZXggLSAxIDogY3VycmVudEZvY3VzSW5kZXggKyAxO1xuICAgICAgdmFyIGZvY3VzRGVzdGluYXRpb24gPSBhbGxGb2N1c2FibGVzW2ZvY3VzRGVzdGluYXRpb25JbmRleF07XG4gICAgICB2YXIgZGVzdGluYXRpb25JdGVtU2xpZGUgPSBjbG9zZXN0KGZvY3VzRGVzdGluYXRpb24sIFNMSURFX1NFTCk7XG4gICAgICB2YXIgZGVzdGluYXRpb25JdGVtU2VjdGlvbiA9IGNsb3Nlc3QoZm9jdXNEZXN0aW5hdGlvbiwgU0VDVElPTl9TRUwpO1xuICAgICAgcmV0dXJuICFkZXN0aW5hdGlvbkl0ZW1TbGlkZSAmJiAhZGVzdGluYXRpb25JdGVtU2VjdGlvbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzaG91bGRDYW5jZWxLZXlib2FyZE5hdmlnYXRpb24oZSkge1xuICAgICAgLy8gaHR0cHM6Ly9rZXljb2RlLmluZm8vZm9yLzM0XG4gICAgICAvLyA0MCA9IGFycm93IGRvd25cbiAgICAgIC8vIDM4ID0gYXJyb3cgdXBcbiAgICAgIC8vIDMyID0gc3BhY2ViYXJcbiAgICAgIC8vIDMzICA9IFBhZ2VVcFxuICAgICAgLy8gMzQgPSBQYWdlRG93blxuICAgICAgdmFyIGtleUNvbnRyb2xzID0gWzQwLCAzOCwgMzIsIDMzLCAzNF07XG4gICAgICByZXR1cm4ga2V5Q29udHJvbHMuaW5kZXhPZihlLmtleUNvZGUpID4gLTEgJiYgIXN0YXRlLmlzQmV5b25kRnVsbHBhZ2U7XG4gICAgfSAvL3ByZXZlbnRpbmcgdGhlIHNjcm9sbCB3aXRoIGFycm93IGtleXMgJiBzcGFjZWJhciAmIFBhZ2UgVXAgJiBEb3duIGtleXNcblxuXG4gICAgZnVuY3Rpb24gY2FuY2VsRGlyZWN0aW9uS2V5RXZlbnRzKGUpIHtcbiAgICAgIGlmIChzaG91bGRDYW5jZWxLZXlib2FyZE5hdmlnYXRpb24oZSkgJiYgIWNsb3Nlc3QoZS50YXJnZXQsIE9WRVJGTE9XX1NFTCkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldENvbnRyb2xQcmVzc2VkKCkge1xuICAgICAgcmV0dXJuIGdfY29udHJvbFByZXNzZWQ7XG4gICAgfVxuXG4gICAgdmFyIHByZXZUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdmFyIHNjcm9sbGluZ3MgPSBbXTtcbiAgICBGUC5zZXRNb3VzZVdoZWVsU2Nyb2xsaW5nID0gc2V0TW91c2VXaGVlbFNjcm9sbGluZztcbiAgICAvKipcbiAgICAqIEFkZHMgb3IgcmVtb3ZlIHRoZSBwb3NzaWJpbGl0eSBvZiBzY3JvbGxpbmcgdGhyb3VnaCBzZWN0aW9ucyBieSB1c2luZyB0aGUgbW91c2Ugd2hlZWwgb3IgdGhlIHRyYWNrcGFkLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBzZXRNb3VzZVdoZWVsU2Nyb2xsaW5nKHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgYWRkTW91c2VXaGVlbEhhbmRsZXIoKTtcbiAgICAgICAgYWRkTWlkZGxlV2hlZWxIYW5kbGVyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW1vdmVNb3VzZVdoZWVsSGFuZGxlcigpO1xuICAgICAgICByZW1vdmVNaWRkbGVXaGVlbEhhbmRsZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgKiBBZGRzIHRoZSBhdXRvIHNjcm9sbGluZyBhY3Rpb24gZm9yIHRoZSBtb3VzZSB3aGVlbCBhbmQgdHJhY2twYWQuXG4gICAgKiBBZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIG1vdXNld2hlZWwgYW5kIHRyYWNrcGFkIG1vdmVtZW50cyB3aWxsIHNjcm9sbCB0aHJvdWdoIHNlY3Rpb25zXG4gICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvd2hlZWxcbiAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBhZGRNb3VzZVdoZWVsSGFuZGxlcigpIHtcbiAgICAgIHZhciBwcmVmaXggPSAnJztcblxuICAgICAgdmFyIF9hZGRFdmVudExpc3RlbmVyO1xuXG4gICAgICBpZiAod2luLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgX2FkZEV2ZW50TGlzdGVuZXIgPSBcImFkZEV2ZW50TGlzdGVuZXJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9hZGRFdmVudExpc3RlbmVyID0gXCJhdHRhY2hFdmVudFwiO1xuICAgICAgICBwcmVmaXggPSAnb24nO1xuICAgICAgfSAvLyBkZXRlY3QgYXZhaWxhYmxlIHdoZWVsIGV2ZW50XG5cblxuICAgICAgdmFyIHN1cHBvcnQgPSAnb253aGVlbCcgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpID8gJ3doZWVsJyA6IC8vIE1vZGVybiBicm93c2VycyBzdXBwb3J0IFwid2hlZWxcIlxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZG9jLm9ubW91c2V3aGVlbCAhPT0gdW5kZWZpbmVkID8gJ21vdXNld2hlZWwnIDogLy8gV2Via2l0IGFuZCBJRSBzdXBwb3J0IGF0IGxlYXN0IFwibW91c2V3aGVlbFwiXG4gICAgICAnRE9NTW91c2VTY3JvbGwnOyAvLyBsZXQncyBhc3N1bWUgdGhhdCByZW1haW5pbmcgYnJvd3NlcnMgYXJlIG9sZGVyIEZpcmVmb3hcblxuICAgICAgdmFyIHBhc3NpdmVFdmVudCA9IGdldFBhc3NpdmVPcHRpb25zSWZQb3NzaWJsZSgpO1xuXG4gICAgICBpZiAoc3VwcG9ydCA9PSAnRE9NTW91c2VTY3JvbGwnKSB7XG4gICAgICAgIGRvY1tfYWRkRXZlbnRMaXN0ZW5lcl0ocHJlZml4ICsgJ01vek1vdXNlUGl4ZWxTY3JvbGwnLCBNb3VzZVdoZWVsSGFuZGxlciwgcGFzc2l2ZUV2ZW50KTtcbiAgICAgIH0gLy9oYW5kbGUgTW96TW91c2VQaXhlbFNjcm9sbCBpbiBvbGRlciBGaXJlZm94XG4gICAgICBlbHNlIHtcbiAgICAgICAgZG9jW19hZGRFdmVudExpc3RlbmVyXShwcmVmaXggKyBzdXBwb3J0LCBNb3VzZVdoZWVsSGFuZGxlciwgcGFzc2l2ZUV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgKiBCaW5kaW5nIHRoZSBtb3VzZW1vdmUgd2hlbiB0aGUgbW91c2UncyBtaWRkbGUgYnV0dG9uIGlzIHByZXNzZWRcbiAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBhZGRNaWRkbGVXaGVlbEhhbmRsZXIoKSB7XG4gICAgICBnZXRDb250YWluZXIoKS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBtb3VzZURvd25IYW5kbGVyKTtcbiAgICAgIGdldENvbnRhaW5lcigpLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBtb3VzZVVwSGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICogUmVtb3ZlcyB0aGUgYXV0byBzY3JvbGxpbmcgYWN0aW9uIGZpcmVkIGJ5IHRoZSBtb3VzZSB3aGVlbCBhbmQgdHJhY2twYWQuXG4gICAgKiBBZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIG1vdXNld2hlZWwgYW5kIHRyYWNrcGFkIG1vdmVtZW50cyB3b24ndCBzY3JvbGwgdGhyb3VnaCBzZWN0aW9ucy5cbiAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiByZW1vdmVNb3VzZVdoZWVsSGFuZGxlcigpIHtcbiAgICAgIGlmIChkb2MuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICBkb2NSZW1vdmVFdmVudCgnbW91c2V3aGVlbCcsIE1vdXNlV2hlZWxIYW5kbGVyLCBmYWxzZSk7IC8vSUU5LCBDaHJvbWUsIFNhZmFyaSwgT3BlclxuXG4gICAgICAgIGRvY1JlbW92ZUV2ZW50KCd3aGVlbCcsIE1vdXNlV2hlZWxIYW5kbGVyLCBmYWxzZSk7IC8vRmlyZWZveFxuXG4gICAgICAgIGRvY1JlbW92ZUV2ZW50KCdNb3pNb3VzZVBpeGVsU2Nyb2xsJywgTW91c2VXaGVlbEhhbmRsZXIsIGZhbHNlKTsgLy9vbGQgRmlyZWZveFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkb2MuZGV0YWNoRXZlbnQoJ29ubW91c2V3aGVlbCcsIE1vdXNlV2hlZWxIYW5kbGVyKTsgLy9JRSA2LzcvOFxuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAqIFVuYmluZGluZyB0aGUgbW91c2Vtb3ZlIHdoZW4gdGhlIG1vdXNlJ3MgbWlkZGxlIGJ1dHRvbiBpcyByZWxlYXNlZFxuICAgICovXG5cblxuICAgIGZ1bmN0aW9uIHJlbW92ZU1pZGRsZVdoZWVsSGFuZGxlcigpIHtcbiAgICAgIGdldENvbnRhaW5lcigpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG1vdXNlRG93bkhhbmRsZXIpO1xuICAgICAgZ2V0Q29udGFpbmVyKCkucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG1vdXNlVXBIYW5kbGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGV0ZWN0aW5nIG1vdXNld2hlZWwgc2Nyb2xsaW5nXG4gICAgICpcbiAgICAgKiBodHRwOi8vYmxvZ3Muc2l0ZXBvaW50c3RhdGljLmNvbS9leGFtcGxlcy90ZWNoL21vdXNlLXdoZWVsL2luZGV4Lmh0bWxcbiAgICAgKiBodHRwOi8vd3d3LnNpdGVwb2ludC5jb20vaHRtbDUtamF2YXNjcmlwdC1tb3VzZS13aGVlbC9cbiAgICAgKi9cblxuXG4gICAgZnVuY3Rpb24gTW91c2VXaGVlbEhhbmRsZXIoZSkge1xuICAgICAgdmFyIGN1clRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIHZhciBpc05vcm1hbFNjcm9sbCA9IGhhc0NsYXNzKCQoQ09NUExFVEVMWV9TRUwpWzBdLCBOT1JNQUxfU0NST0xMKTtcbiAgICAgIHZhciBpc1Njcm9sbEFsbG93ZWRCZXlvbmRGdWxsUGFnZSA9IGJleW9uZEZ1bGxQYWdlSGFuZGxlcihnZXRDb250YWluZXIoKSwgZSk7XG5cbiAgICAgIGlmICghc3RhdGUuaXNVc2luZ1doZWVsKSB7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBpc0dyYWJiaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc1VzaW5nV2hlZWw6IHRydWUsXG4gICAgICAgICAgdG91Y2hEaXJlY3Rpb246ICdub25lJ1xuICAgICAgICB9KTtcbiAgICAgIH0gLy9pcyBzY3JvbGwgYWxsb3dlZD9cblxuXG4gICAgICBpZiAoIWdldElzU2Nyb2xsQWxsb3dlZCgpLm0uZG93biAmJiAhZ2V0SXNTY3JvbGxBbGxvd2VkKCkubS51cCkge1xuICAgICAgICBwcmV2ZW50RGVmYXVsdChlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNTY3JvbGxBbGxvd2VkQmV5b25kRnVsbFBhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGlzU2Nyb2xsQWxsb3dlZEJleW9uZEZ1bGxQYWdlID09PSBmYWxzZSkge1xuICAgICAgICBwcmV2ZW50RGVmYXVsdChlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSAvL2F1dG9zY3JvbGxpbmcgYW5kIG5vdCB6b29taW5nP1xuXG5cbiAgICAgIGlmIChnZXRPcHRpb25zKCkuYXV0b1Njcm9sbGluZyAmJiAhZ2V0Q29udHJvbFByZXNzZWQoKSAmJiAhaXNOb3JtYWxTY3JvbGwpIHtcbiAgICAgICAgLy8gY3Jvc3MtYnJvd3NlciB3aGVlbCBkZWx0YVxuICAgICAgICBlID0gZSB8fCB3aW4uZXZlbnQ7XG4gICAgICAgIHZhciB2YWx1ZSA9IGUud2hlZWxEZWx0YSB8fCAtZS5kZWx0YVkgfHwgLWUuZGV0YWlsO1xuICAgICAgICB2YXIgZGVsdGEgPSBNYXRoLm1heCgtMSwgTWF0aC5taW4oMSwgdmFsdWUpKTtcbiAgICAgICAgdmFyIGhvcml6b250YWxEZXRlY3Rpb24gPSB0eXBlb2YgZS53aGVlbERlbHRhWCAhPT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGUuZGVsdGFYICE9PSAndW5kZWZpbmVkJztcbiAgICAgICAgdmFyIGlzU2Nyb2xsaW5nVmVydGljYWxseSA9IE1hdGguYWJzKGUud2hlZWxEZWx0YVgpIDwgTWF0aC5hYnMoZS53aGVlbERlbHRhKSB8fCBNYXRoLmFicyhlLmRlbHRhWCkgPCBNYXRoLmFicyhlLmRlbHRhWSkgfHwgIWhvcml6b250YWxEZXRlY3Rpb247XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBkZWx0YSA8IDAgPyAnZG93bicgOiBkZWx0YSA+IDAgPyAndXAnIDogJ25vbmUnOyAvL0xpbWl0aW5nIHRoZSBhcnJheSB0byAxNTAgKGxldHMgbm90IHdhc3RlIG1lbW9yeSEpXG5cbiAgICAgICAgaWYgKHNjcm9sbGluZ3MubGVuZ3RoID4gMTQ5KSB7XG4gICAgICAgICAgc2Nyb2xsaW5ncy5zaGlmdCgpO1xuICAgICAgICB9IC8va2VlcGluZyByZWNvcmQgb2YgdGhlIHByZXZpb3VzIHNjcm9sbGluZ3NcblxuXG4gICAgICAgIHNjcm9sbGluZ3MucHVzaChNYXRoLmFicyh2YWx1ZSkpOyAvL3ByZXZlbnRpbmcgdG8gc2Nyb2xsIHRoZSBzaXRlIG9uIG1vdXNlIHdoZWVsIHdoZW4gc2Nyb2xsYmFyIGlzIHByZXNlbnRcblxuICAgICAgICBpZiAoZ2V0T3B0aW9ucygpLnNjcm9sbEJhcikge1xuICAgICAgICAgIHByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgICB9IC8vdGltZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGxhc3Qgc2Nyb2xsIGFuZCB0aGUgY3VycmVudCBvbmVcblxuXG4gICAgICAgIHZhciB0aW1lRGlmZiA9IGN1clRpbWUgLSBwcmV2VGltZTtcbiAgICAgICAgcHJldlRpbWUgPSBjdXJUaW1lOyAvL2hhdmVuJ3QgdGhleSBzY3JvbGxlZCBpbiBhIHdoaWxlP1xuICAgICAgICAvLyhlbm91Z2ggdG8gYmUgY29uc2lkZXIgYSBkaWZmZXJlbnQgc2Nyb2xsaW5nIGFjdGlvbiB0byBzY3JvbGwgYW5vdGhlciBzZWN0aW9uKVxuXG4gICAgICAgIGlmICh0aW1lRGlmZiA+IDIwMCkge1xuICAgICAgICAgIC8vZW1wdHlpbmcgdGhlIGFycmF5LCB3ZSBkb250IGNhcmUgYWJvdXQgb2xkIHNjcm9sbGluZ3MgZm9yIG91ciBhdmVyYWdlc1xuICAgICAgICAgIHNjcm9sbGluZ3MgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICB3aGVlbERpcmVjdGlvbjogZGlyZWN0aW9uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzdGF0ZS5jYW5TY3JvbGwpIHtcbiAgICAgICAgICB2YXIgYXZlcmFnZUVuZCA9IGdldEF2ZXJhZ2Uoc2Nyb2xsaW5ncywgMTApO1xuICAgICAgICAgIHZhciBhdmVyYWdlTWlkZGxlID0gZ2V0QXZlcmFnZShzY3JvbGxpbmdzLCA3MCk7XG4gICAgICAgICAgdmFyIGlzQWNjZWxlcmF0aW5nID0gYXZlcmFnZUVuZCA+PSBhdmVyYWdlTWlkZGxlOyAvL3RvIGF2b2lkIGRvdWJsZSBzd2lwZXMuLi5cblxuICAgICAgICAgIGlmIChpc0FjY2VsZXJhdGluZyAmJiBpc1Njcm9sbGluZ1ZlcnRpY2FsbHkpIHtcbiAgICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgICAgc2Nyb2xsVHJpZ2dlcjogJ3doZWVsJ1xuICAgICAgICAgICAgfSk7IC8vc2Nyb2xsaW5nIGRvd24/XG5cbiAgICAgICAgICAgIGlmIChkZWx0YSA8IDApIHtcbiAgICAgICAgICAgICAgc2Nyb2xsaW5nKCdkb3duJyk7XG4gICAgICAgICAgICB9IC8vc2Nyb2xsaW5nIHVwP1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHNjcm9sbGluZygndXAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRPcHRpb25zKCkuZml0VG9TZWN0aW9uKSB7XG4gICAgICAgIC8vc3RvcHBpbmcgdGhlIGF1dG8gc2Nyb2xsIHRvIGFkanVzdCB0byBhIHNlY3Rpb25cbiAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgIGFjdGl2ZUFuaW1hdGlvbjogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSAvL2JpbmRpbmcgdGhlIG1vdXNlbW92ZSB3aGVuIHRoZSBtb3VzZSdzIG1pZGRsZSBidXR0b24gaXMgcmVsZWFzZWRcblxuXG4gICAgZnVuY3Rpb24gbW91c2VEb3duSGFuZGxlcihlKSB7XG4gICAgICAvL21pZGRsZSBidXR0b25cbiAgICAgIGlmIChlLndoaWNoID09IDIpIHtcbiAgICAgICAgc2V0T2xkUGFnZVkoZS5wYWdlWSk7XG4gICAgICAgIGdldENvbnRhaW5lcigpLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdXNlTW92ZUhhbmRsZXIpO1xuICAgICAgfVxuICAgIH0gLy91bmJpbmRpbmcgdGhlIG1vdXNlbW92ZSB3aGVuIHRoZSBtb3VzZSdzIG1pZGRsZSBidXR0b24gaXMgcmVsZWFzZWRcblxuXG4gICAgZnVuY3Rpb24gbW91c2VVcEhhbmRsZXIoZSkge1xuICAgICAgLy9taWRkbGUgYnV0dG9uXG4gICAgICBpZiAoZS53aGljaCA9PSAyKSB7XG4gICAgICAgIGdldENvbnRhaW5lcigpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdXNlTW92ZUhhbmRsZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAqIEFkZHMgb3IgcmVtb3ZlIHRoZSBtb3VzZSB3aGVlbCBoaWphY2tpbmdcbiAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBzZXRNb3VzZUhpamFjayh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHNldE1vdXNlV2hlZWxTY3JvbGxpbmcodHJ1ZSk7XG4gICAgICAgIGFkZFRvdWNoSGFuZGxlcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0TW91c2VXaGVlbFNjcm9sbGluZyhmYWxzZSk7XG4gICAgICAgIHJlbW92ZVRvdWNoSGFuZGxlcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBnX2NhbkZpcmVNb3VzZUVudGVyTm9ybWFsU2Nyb2xsID0gdHJ1ZTtcbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRzLmJpbmRFdmVudHMsIGJpbmRFdmVudHMkNyk7XG5cbiAgICBmdW5jdGlvbiBiaW5kRXZlbnRzJDcoKSB7XG4gICAgICAvKipcbiAgICAgICogQXBwbHlpbmcgbm9ybWFsU2Nyb2xsIGVsZW1lbnRzLlxuICAgICAgKiBJZ25vcmluZyB0aGUgc2Nyb2xscyBvdmVyIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3JzLlxuICAgICAgKi9cbiAgICAgIGlmIChnZXRPcHRpb25zKCkubm9ybWFsU2Nyb2xsRWxlbWVudHMpIHtcbiAgICAgICAgWydtb3VzZWVudGVyJywgJ3RvdWNoc3RhcnQnXS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgICBmb3JNb3VzZUxlYXZlT3JUb3VjaChldmVudE5hbWUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFsnbW91c2VsZWF2ZScsICd0b3VjaGVuZCddLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICAgIGZvck1vdXNlTGVhdmVPclRvdWNoKGV2ZW50TmFtZSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRzLm9uRGVzdHJveSwgb25EZXN0cm95JDQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uRGVzdHJveSQ0KCkge1xuICAgICAgWydtb3VzZWVudGVyJywgJ3RvdWNoc3RhcnQnLCAnbW91c2VsZWF2ZScsICd0b3VjaGVuZCddLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICBkb2NSZW1vdmVFdmVudChldmVudE5hbWUsIG9uTW91c2VFbnRlck9yTGVhdmUsIHRydWUpOyAvL3RydWUgaXMgcmVxdWlyZWQhXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JNb3VzZUxlYXZlT3JUb3VjaChldmVudE5hbWUsIGFsbG93U2Nyb2xsaW5nKSB7XG4gICAgICAvL2Egd2F5IHRvIHBhc3MgYXJndW1lbnRzIHRvIHRoZSBvbk1vdXNlRW50ZXJPckxlYXZlIGZ1bmN0aW9uXG4gICAgICBkb2N1bWVudFsnZnBfJyArIGV2ZW50TmFtZV0gPSBhbGxvd1Njcm9sbGluZztcbiAgICAgIGRvY0FkZEV2ZW50KGV2ZW50TmFtZSwgb25Nb3VzZUVudGVyT3JMZWF2ZSwgdHJ1ZSk7IC8vY2FwdHVyaW5nIHBoYXNlXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Nb3VzZUVudGVyT3JMZWF2ZShlKSB7XG4gICAgICB2YXIgdHlwZSA9IGUudHlwZTtcbiAgICAgIHZhciBpc0luc2lkZU9uZU5vcm1hbFNjcm9sbCA9IGZhbHNlOyAvL29uTW91c2VMZWF2ZSB3aWxsIHVzZSB0aGUgZGVzdGluYXRpb24gdGFyZ2V0LCBub3QgdGhlIG9uZSB3ZSBhcmUgbW92aW5nIGF3YXkgZnJvbVxuXG4gICAgICB2YXIgdGFyZ2V0ID0gdHlwZSA9PT0gJ21vdXNlbGVhdmUnID8gZS50b0VsZW1lbnQgfHwgZS5yZWxhdGVkVGFyZ2V0IDogZS50YXJnZXQ7IC8vY29taW5nIGZyb20gY2xvc2luZyBhIG5vcm1hbFNjcm9sbEVsZW1lbnRzIG1vZGFsIG9yIG1vdmluZyBvdXRzaWRlIHZpZXdwb3J0P1xuXG4gICAgICBpZiAodGFyZ2V0ID09IGRvY3VtZW50IHx8ICF0YXJnZXQpIHtcbiAgICAgICAgc2V0TW91c2VIaWphY2sodHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaGVuZCcpIHtcbiAgICAgICAgZ19jYW5GaXJlTW91c2VFbnRlck5vcm1hbFNjcm9sbCA9IGZhbHNlO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBnX2NhbkZpcmVNb3VzZUVudGVyTm9ybWFsU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgfSwgODAwKTtcbiAgICAgIH0gLy9wcmV2ZW50aW5nIG1vdXNlZW50ZXIgZXZlbnQgdG8gZG8gYW55dGhpbmcgd2hlbiBjb21pbmcgZnJvbSBhIHRvdWNoRW5kIGV2ZW50XG4gICAgICAvL2ZpeGluZyBpc3N1ZSAjMzU3NlxuXG5cbiAgICAgIGlmICh0eXBlID09PSAnbW91c2VlbnRlcicgJiYgIWdfY2FuRmlyZU1vdXNlRW50ZXJOb3JtYWxTY3JvbGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgbm9ybWFsU2VsZWN0b3JzID0gZ2V0T3B0aW9ucygpLm5vcm1hbFNjcm9sbEVsZW1lbnRzLnNwbGl0KCcsJyk7XG4gICAgICBub3JtYWxTZWxlY3RvcnMuZm9yRWFjaChmdW5jdGlvbiAobm9ybWFsU2VsZWN0b3IpIHtcbiAgICAgICAgaWYgKCFpc0luc2lkZU9uZU5vcm1hbFNjcm9sbCkge1xuICAgICAgICAgIHZhciBpc05vcm1hbFNjcm9sbFRhcmdldCA9IG1hdGNoZXModGFyZ2V0LCBub3JtYWxTZWxlY3Rvcik7IC8vbGVhdmluZyBhIGNoaWxkIGluc2lkZSB0aGUgbm9ybWFsU2NvbGwgZWxlbWVudCBpcyBub3QgbGVhdmluZyB0aGUgbm9ybWFsU2Nyb2xsICMzNjYxXG5cbiAgICAgICAgICB2YXIgaXNOb3JtYWxTY3JvbGxDaGlsZEZvY3VzZWQgPSBjbG9zZXN0KHRhcmdldCwgbm9ybWFsU2VsZWN0b3IpO1xuXG4gICAgICAgICAgaWYgKGlzTm9ybWFsU2Nyb2xsVGFyZ2V0IHx8IGlzTm9ybWFsU2Nyb2xsQ2hpbGRGb2N1c2VkKSB7XG4gICAgICAgICAgICBpZiAoIUZQLnNoYXJlZC5pc05vcm1hbFNjcm9sbEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgc2V0TW91c2VIaWphY2soZmFsc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBGUC5zaGFyZWQuaXNOb3JtYWxTY3JvbGxFbGVtZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIGlzSW5zaWRlT25lTm9ybWFsU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pOyAvL25vdCBpbnNpZGUgYSBzaW5nbGUgbm9ybWFsIHNjcm9sbCBlbGVtZW50IGFueW1vcmU/XG5cbiAgICAgIGlmICghaXNJbnNpZGVPbmVOb3JtYWxTY3JvbGwgJiYgRlAuc2hhcmVkLmlzTm9ybWFsU2Nyb2xsRWxlbWVudCkge1xuICAgICAgICBzZXRNb3VzZUhpamFjayh0cnVlKTtcbiAgICAgICAgRlAuc2hhcmVkLmlzTm9ybWFsU2Nyb2xsRWxlbWVudCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIEZQLnNpbGVudE1vdmVUbyA9IHNpbGVudE1vdmVUbztcbiAgICAvKipcbiAgICAqIE1vdmVzIHRoZSBwYWdlIHRvIHRoZSBnaXZlbiBzZWN0aW9uIGFuZCBzbGlkZSB3aXRoIG5vIGFuaW1hdGlvbi5cbiAgICAqIEFuY2hvcnMgb3IgaW5kZXggcG9zaXRpb25zIGNhbiBiZSB1c2VkIGFzIHBhcmFtcy5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gc2lsZW50TW92ZVRvKHNlY3Rpb25BbmNob3IsIHNsaWRlQW5jaG9yKSB7XG4gICAgICBzZXRTY3JvbGxpbmdTcGVlZCgwLCAnaW50ZXJuYWwnKTtcbiAgICAgIG1vdmVUbyQxKHNlY3Rpb25BbmNob3IsIHNsaWRlQW5jaG9yKTtcbiAgICAgIHNldFNjcm9sbGluZ1NwZWVkKGdldE9yaWdpbmFscygpLnNjcm9sbGluZ1NwZWVkLCAnaW50ZXJuYWwnKTtcbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNIZWlnaHQgPSBnZXRXaW5kb3dIZWlnaHQoKTtcbiAgICB2YXIgd2luZG93c1dpZHRoID0gZ2V0V2luZG93V2lkdGgoKTtcbiAgICB2YXIgZ19yZXNpemVJZDtcbiAgICB2YXIgZ19pc0NvbnNlY3V0aXZlUmVzaXplID0gZmFsc2U7XG4gICAgdmFyIGdfcmVzaXplTW9iaWxlSGFuZGxlcklkO1xuICAgIEZQLnJlQnVpbGQgPSByZUJ1aWxkO1xuICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMuYmluZEV2ZW50cywgYmluZEV2ZW50cyQ2KTtcblxuICAgIGZ1bmN0aW9uIGJpbmRFdmVudHMkNigpIHtcbiAgICAgIC8vIFNldHRpbmcgVkggY29ycmVjdGx5IGluIG1vYmlsZSBkZXZpY2VzXG4gICAgICByZXNpemVIYW5kbGVyKCk7IC8vd2hlbiByZXNpemluZyB0aGUgc2l0ZSwgd2UgYWRqdXN0IHRoZSBoZWlnaHRzIG9mIHRoZSBzZWN0aW9ucywgc2xpbVNjcm9sbC4uLlxuXG4gICAgICB3aW5kb3dBZGRFdmVudCgncmVzaXplJywgcmVzaXplSGFuZGxlcik7XG4gICAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRzLm9uRGVzdHJveSwgb25EZXN0cm95JDMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uRGVzdHJveSQzKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGdfcmVzaXplSWQpO1xuICAgICAgY2xlYXJUaW1lb3V0KGdfcmVzaXplTW9iaWxlSGFuZGxlcklkKTtcbiAgICAgIHdpbmRvd1JlbW92ZUV2ZW50KCdyZXNpemUnLCByZXNpemVIYW5kbGVyKTtcbiAgICB9XG4gICAgLypcbiAgICAqIFJlc2l6ZSBldmVudCBoYW5kbGVyLlxuICAgICovXG5cblxuICAgIGZ1bmN0aW9uIHJlc2l6ZUhhbmRsZXIoKSB7XG4gICAgICBpZiAoIWdfaXNDb25zZWN1dGl2ZVJlc2l6ZSkge1xuICAgICAgICBpZiAoZ2V0T3B0aW9ucygpLmF1dG9TY3JvbGxpbmcgJiYgIWdldE9wdGlvbnMoKS5zY3JvbGxCYXIgfHwgIWdldE9wdGlvbnMoKS5maXRUb1NlY3Rpb24pIHtcbiAgICAgICAgICBzZXRTZWN0aW9uc0hlaWdodChnZXRXaW5kb3dIZWlnaHQoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZml0VG9BY3RpdmVTZWN0aW9uKCk7XG4gICAgICBnX2lzQ29uc2VjdXRpdmVSZXNpemUgPSB0cnVlOyAvL2luIG9yZGVyIHRvIGNhbGwgdGhlIGZ1bmN0aW9ucyBvbmx5IHdoZW4gdGhlIHJlc2l6ZSBpcyBmaW5pc2hlZFxuICAgICAgLy9odHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQyOTg2MTIvanF1ZXJ5LWhvdy10by1jYWxsLXJlc2l6ZS1ldmVudC1vbmx5LW9uY2UtaXRzLWZpbmlzaGVkLXJlc2l6aW5nICAgIFxuXG4gICAgICBjbGVhclRpbWVvdXQoZ19yZXNpemVJZCk7XG4gICAgICBnX3Jlc2l6ZUlkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vaXNzdWUgIzMzMzYgXG4gICAgICAgIC8vKHNvbWUgYXBwcyBvciBicm93c2VycywgbGlrZSBDaHJvbWUvRmlyZWZveCBmb3IgTW9iaWxlIHRha2UgdGltZSB0byByZXBvcnQgdGhlIHJlYWwgaGVpZ2h0KVxuICAgICAgICAvL3NvIHdlIGNoZWNrIGl0IDMgdGltZXMgd2l0aCBpbnRlcnZhbHMgaW4gdGhhdCBjYXNlXG4gICAgICAgIC8vIGZvcih2YXIgaSA9IDA7IGk8IDQ7IGkrKyl7XG4gICAgICAgIHJlc2l6ZUFjdGlvbnMoKTtcbiAgICAgICAgZ19pc0NvbnNlY3V0aXZlUmVzaXplID0gZmFsc2U7IC8vIH1cbiAgICAgIH0sIDQwMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZml0VG9BY3RpdmVTZWN0aW9uKCkge1xuICAgICAgaWYgKGlzVG91Y2hEZXZpY2UpIHtcbiAgICAgICAgLy8gSXNzdWUgIzQzOTMgYW5kIHByZXZpb3VzbHkgaW4gdjMsICMzMzM2XG4gICAgICAgIC8vIChzb21lIGFwcHMgb3IgYnJvd3NlcnMsIGxpa2UgQ2hyb21lL0ZpcmVmb3ggd2lsbCBkZWxheSBhIGJpdCB0byBzY3JvbGwgXG4gICAgICAgIC8vIHRvIHRoZSBmb2N1c2VkIGlucHV0XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgZ19yZXNpemVNb2JpbGVIYW5kbGVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAvLyBvbiBBbmRyb2lkIGRldmljZXMgdGhlIGJyb3dzZXIgc2Nyb2xscyB0byB0aGUgZm9jdXNlZCBlbGVtZW50XG4gICAgICAgICAgICAgIC8vIG1lc3NpbmcgdXAgdGhlIHdob2xlIHBhZ2Ugc3RydWN0dXJlLiBTbyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGVcbiAgICAgICAgICAgICAgLy8gdHJhbnNsYXRlM2QgdmFsdWUgd2hlbiB0aGUga2V5Ym9hcmQgc2hvd3MvaGlkZXNcbiAgICAgICAgICAgICAgaWYgKGdldE9wdGlvbnMoKS5hdXRvU2Nyb2xsaW5nICYmICFnZXRPcHRpb25zKCkuc2Nyb2xsQmFyKSB7XG4gICAgICAgICAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgaXNSZXNpemluZzogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHNpbGVudE1vdmVUbyhzdGF0ZS5hY3RpdmVTZWN0aW9uLmluZGV4KCkgKyAxKTtcbiAgICAgICAgICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCAyMDAgKiBpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAqIFdoZW4gcmVzaXppbmcgdGhlIHNpdGUsIHdlIGFkanVzdCB0aGUgaGVpZ2h0cyBvZiB0aGUgc2VjdGlvbnMsIHNsaW1TY3JvbGwuLi5cbiAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiByZXNpemVBY3Rpb25zKCkge1xuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICBpc1Jlc2l6aW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHNldFNlY3Rpb25zSGVpZ2h0KCcnKTtcblxuICAgICAgaWYgKCFnZXRPcHRpb25zKCkuYXV0b1Njcm9sbGluZyAmJiAhc3RhdGUuaXNCZXlvbmRGdWxscGFnZSkge1xuICAgICAgICBzZXRWaFVuaXRzKCk7XG4gICAgICB9XG5cbiAgICAgIEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50cy5jb250ZW50Q2hhbmdlZCk7XG4gICAgICB1cGRhdGVTdGF0ZSgpOyAvL2NoZWNraW5nIGlmIGl0IG5lZWRzIHRvIGdldCByZXNwb25zaXZlXG5cbiAgICAgIHJlc3BvbnNpdmUoKTsgLy8gcmVidWlsZCBpbW1lZGlhdGVseSBvbiB0b3VjaCBkZXZpY2VzXG5cbiAgICAgIGlmIChpc1RvdWNoRGV2aWNlKSB7XG4gICAgICAgIHZhciBhY3RpdmVFbGVtZW50ID0gZG9jLmFjdGl2ZUVsZW1lbnQ7IC8vaWYgdGhlIGtleWJvYXJkIGlzIE5PVCB2aXNpYmxlXG5cbiAgICAgICAgaWYgKCFtYXRjaGVzKGFjdGl2ZUVsZW1lbnQsICd0ZXh0YXJlYScpICYmICFtYXRjaGVzKGFjdGl2ZUVsZW1lbnQsICdpbnB1dCcpICYmICFtYXRjaGVzKGFjdGl2ZUVsZW1lbnQsICdzZWxlY3QnKSkge1xuICAgICAgICAgIHZhciBjdXJyZW50SGVpZ2h0ID0gZ2V0V2luZG93SGVpZ2h0KCk7IC8vbWFraW5nIHN1cmUgdGhlIGNoYW5nZSBpbiB0aGUgdmlld3BvcnQgc2l6ZSBpcyBlbm91Z2ggdG8gZm9yY2UgYSByZWJ1aWxkLiAoMjAgJSBvZiB0aGUgd2luZG93IHRvIGF2b2lkIHByb2JsZW1zIHdoZW4gaGlkZGluZyBzY3JvbGwgYmFycylcblxuICAgICAgICAgIGlmIChNYXRoLmFicyhjdXJyZW50SGVpZ2h0IC0gcHJldmlvdXNIZWlnaHQpID4gMjAgKiBNYXRoLm1heChwcmV2aW91c0hlaWdodCwgY3VycmVudEhlaWdodCkgLyAxMDApIHtcbiAgICAgICAgICAgIHJlQnVpbGQodHJ1ZSk7XG4gICAgICAgICAgICBwcmV2aW91c0hlaWdodCA9IGN1cnJlbnRIZWlnaHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGp1c3RUb05ld1ZpZXdwb3J0KCk7XG4gICAgICB9XG5cbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgaXNSZXNpemluZzogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIHJlc2l6aW5nIGlzIGZpbmlzaGVkLCB3ZSBhZGp1c3QgdGhlIHNsaWRlcyBzaXplcyBhbmQgcG9zaXRpb25zXG4gICAgICovXG5cblxuICAgIGZ1bmN0aW9uIHJlQnVpbGQocmVzaXppbmcpIHtcbiAgICAgIGlmIChoYXNDbGFzcyhnZXRDb250YWluZXIoKSwgREVTVFJPWUVEKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vbm90aGluZyB0byBkbyBpZiB0aGUgcGx1Z2luIHdhcyBkZXN0cm95ZWRcbiAgICAgIC8vdXBkYXRpbmcgZ2xvYmFsIHZhcnNcblxuXG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGlzUmVzaXppbmc6IHRydWUsXG4gICAgICAgIHdpbmRvd3NIZWlnaHQ6IGdldFdpbmRvd0hlaWdodCgpLFxuICAgICAgICB3aW5kb3dzV2lkdGg6IGdldFdpbmRvd1dpZHRoKClcbiAgICAgIH0pO1xuICAgICAgdmFyIHNlY3Rpb25zID0gZ2V0U3RhdGUoKS5zZWN0aW9ucztcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9ucy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgc2VjdGlvbiA9IHNlY3Rpb25zW2ldO1xuICAgICAgICB2YXIgc2xpZGVzV3JhcCA9ICQoU0xJREVTX1dSQVBQRVJfU0VMLCBzZWN0aW9uLml0ZW0pWzBdO1xuICAgICAgICB2YXIgc2xpZGVzID0gc2VjdGlvbi5zbGlkZXM7IC8vYWRqdXN0aW5nIHRoZSBwb3NpdGlvbiBmbyB0aGUgRlVMTCBXSURUSCBzbGlkZXMuLi5cblxuICAgICAgICBpZiAoc2xpZGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBsYW5kc2NhcGVTY3JvbGwoc2xpZGVzV3JhcCwgc2VjdGlvbi5hY3RpdmVTbGlkZS5pdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0T3B0aW9ucygpLnNjcm9sbE92ZXJmbG93KSB7XG4gICAgICAgIHNjcm9sbE92ZXJmbG93SGFuZGxlci5tYWtlU2Nyb2xsYWJsZSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2VjdGlvbkluZGV4ID0gZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uLmluZGV4KCk7XG5cbiAgICAgIGlmICghc3RhdGUuaXNCZXlvbmRGdWxscGFnZSkge1xuICAgICAgICAvL2lzbid0IGl0IHRoZSBmaXJzdCBzZWN0aW9uP1xuICAgICAgICBpZiAoc2VjdGlvbkluZGV4KSB7XG4gICAgICAgICAgLy9hZGp1c3RpbmcgdGhlIHBvc2l0aW9uIGZvciB0aGUgY3VycmVudCBzZWN0aW9uXG4gICAgICAgICAgc2lsZW50TW92ZVRvKHNlY3Rpb25JbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgaXNSZXNpemluZzogZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXNGdW5jdGlvbihnZXRPcHRpb25zKCkuYWZ0ZXJSZXNpemUpICYmIHJlc2l6aW5nKSB7XG4gICAgICAgIGdldE9wdGlvbnMoKS5hZnRlclJlc2l6ZS5jYWxsKGdldENvbnRhaW5lcigpLCB3aW4uaW5uZXJXaWR0aCwgd2luLmlubmVySGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRnVuY3Rpb24oZ2V0T3B0aW9ucygpLmFmdGVyUmVCdWlsZCkgJiYgIXJlc2l6aW5nKSB7XG4gICAgICAgIGdldE9wdGlvbnMoKS5hZnRlclJlQnVpbGQuY2FsbChnZXRDb250YWluZXIoKSk7XG4gICAgICB9XG5cbiAgICAgIHRyaWdnZXIoZ2V0Q29udGFpbmVyKCksICdhZnRlclJlYnVpbGQnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBBZGp1c3RzIGEgc2VjdGlvbiB0byB0aGUgdmlld3BvcnQgaWYgaXQgaGFzIGNoYW5nZWQuXG4gICAgKi9cblxuXG4gICAgZnVuY3Rpb24gYWRqdXN0VG9OZXdWaWV3cG9ydCgpIHtcbiAgICAgIHZhciBuZXdXaW5kb3dIZWlnaHQgPSBnZXRXaW5kb3dIZWlnaHQoKTtcbiAgICAgIHZhciBuZXdXaW5kb3dXaWR0aCA9IGdldFdpbmRvd1dpZHRoKCk7XG5cbiAgICAgIGlmIChzdGF0ZS53aW5kb3dzSGVpZ2h0ICE9PSBuZXdXaW5kb3dIZWlnaHQgfHwgd2luZG93c1dpZHRoICE9PSBuZXdXaW5kb3dXaWR0aCkge1xuICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgd2luZG93c0hlaWdodDogbmV3V2luZG93SGVpZ2h0XG4gICAgICAgIH0pO1xuICAgICAgICB3aW5kb3dzV2lkdGggPSBuZXdXaW5kb3dXaWR0aDtcbiAgICAgICAgcmVCdWlsZCh0cnVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRTZWN0aW9uc0hlaWdodCh2YWx1ZSkge1xuICAgICAgdmFyIHByb3BlcnR5VmFsdWUgPSB2YWx1ZSA9PT0gJycgPyAnJyA6IHZhbHVlICsgJ3B4JztcbiAgICAgIGdldFN0YXRlKCkuc2VjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc2VjdGlvbikge1xuICAgICAgICBjc3Moc2VjdGlvbi5pdGVtLCB7XG4gICAgICAgICAgJ2hlaWdodCc6IHByb3BlcnR5VmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVmaW5pbmcgdGhlIHZhbHVlIGluIHB4IG9mIGEgVkggdW5pdC4gKFVzZWQgZm9yIGF1dG9TY3JvbGxpbmc6IGZhbHNlKVxuICAgICAqIFRvIGZpeCB0aGUgaGVpZ2h0IGlzc3VlIG9uIG1vYmlsZSBkZXZpY2VzIHdoZW4gdXNpbmcgVkggdW5pdHMuXG4gICAgICogaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS90aGUtdHJpY2stdG8tdmlld3BvcnQtdW5pdHMtb24tbW9iaWxlL1xuICAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBzZXRWaFVuaXRzKCkge1xuICAgICAgaWYgKCFnZXRPcHRpb25zKCkuYXV0b1Njcm9sbGluZyB8fCBnZXRPcHRpb25zKCkuc2Nyb2xsQmFyKSB7XG4gICAgICAgIC8vIEZpcnN0IHdlIGdldCB0aGUgdmlld3BvcnQgaGVpZ2h0IGFuZCB3ZSBtdWx0aXBsZSBpdCBieSAxJSB0byBnZXQgYSB2YWx1ZSBmb3IgYSB2aCB1bml0XG4gICAgICAgIHZhciB2aCA9IHdpbi5pbm5lckhlaWdodCAqIDAuMDE7IC8vIFRoZW4gd2Ugc2V0IHRoZSB2YWx1ZSBpbiB0aGUgLS12aCBjdXN0b20gcHJvcGVydHkgdG8gdGhlIHJvb3Qgb2YgdGhlIGRvY3VtZW50XG5cbiAgICAgICAgZG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS12aCcsIFwiXCIuY29uY2F0KHZoLCBcInB4XCIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRBbmNob3JzVVJMKCkge1xuICAgICAgdmFyIHNlY3Rpb247XG4gICAgICB2YXIgc2xpZGU7XG4gICAgICB2YXIgaGFzaCA9IHdpbi5sb2NhdGlvbi5oYXNoO1xuXG4gICAgICBpZiAoaGFzaC5sZW5ndGgpIHtcbiAgICAgICAgLy9nZXR0aW5nIHRoZSBhbmNob3IgbGluayBpbiB0aGUgVVJMIGFuZCBkZWxldGluZyB0aGUgYCNgXG4gICAgICAgIHZhciBhbmNob3JzUGFydHMgPSBoYXNoLnJlcGxhY2UoJyMnLCAnJykuc3BsaXQoJy8nKTsgLy91c2luZyAvIGZvciB2aXN1YWwgcmVhc29ucyBhbmQgbm90IGFzIGEgc2VjdGlvbi9zbGlkZSBzZXBhcmF0b3IgIzI4MDNcblxuICAgICAgICB2YXIgaXNGdW5reUFuY2hvciA9IGhhc2guaW5kZXhPZignIy8nKSA+IC0xO1xuICAgICAgICBzZWN0aW9uID0gaXNGdW5reUFuY2hvciA/ICcvJyArIGFuY2hvcnNQYXJ0c1sxXSA6IGRlY29kZVVSSUNvbXBvbmVudChhbmNob3JzUGFydHNbMF0pO1xuICAgICAgICB2YXIgc2xpZGVBbmNob3IgPSBpc0Z1bmt5QW5jaG9yID8gYW5jaG9yc1BhcnRzWzJdIDogYW5jaG9yc1BhcnRzWzFdO1xuXG4gICAgICAgIGlmIChzbGlkZUFuY2hvciAmJiBzbGlkZUFuY2hvci5sZW5ndGgpIHtcbiAgICAgICAgICBzbGlkZSA9IGRlY29kZVVSSUNvbXBvbmVudChzbGlkZUFuY2hvcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VjdGlvbjogc2VjdGlvbixcbiAgICAgICAgc2xpZGU6IHNsaWRlXG4gICAgICB9O1xuICAgIH1cblxuICAgIEZQLnNldExvY2tBbmNob3JzID0gc2V0TG9ja0FuY2hvcnM7XG4gICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50cy5iaW5kRXZlbnRzLCBiaW5kRXZlbnRzJDUpO1xuXG4gICAgZnVuY3Rpb24gYmluZEV2ZW50cyQ1KCkge1xuICAgICAgLy9kZXRlY3RpbmcgYW55IGNoYW5nZSBvbiB0aGUgVVJMIHRvIHNjcm9sbCB0byB0aGUgZ2l2ZW4gYW5jaG9yIGxpbmtcbiAgICAgIC8vKGEgd2F5IHRvIGRldGVjdCBiYWNrIGhpc3RvcnkgYnV0dG9uIGFzIHdlIHBsYXkgd2l0aCB0aGUgaGFzaGVzIG9uIHRoZSBVUkwpXG4gICAgICB3aW5kb3dBZGRFdmVudCgnaGFzaGNoYW5nZScsIGhhc2hDaGFuZ2VIYW5kbGVyKTtcbiAgICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMub25EZXN0cm95LCBvbkRlc3Ryb3kkMik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25EZXN0cm95JDIoKSB7XG4gICAgICB3aW5kb3dSZW1vdmVFdmVudCgnaGFzaGNoYW5nZScsIGhhc2hDaGFuZ2VIYW5kbGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBTZXRzIGxvY2tBbmNob3JzXG4gICAgKi9cblxuXG4gICAgZnVuY3Rpb24gc2V0TG9ja0FuY2hvcnModmFsdWUpIHtcbiAgICAgIGdldE9wdGlvbnMoKS5sb2NrQW5jaG9ycyA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAqIERldGVjdGluZyBhbnkgY2hhbmdlIG9uIHRoZSBVUkwgdG8gc2Nyb2xsIHRvIHRoZSBnaXZlbiBhbmNob3IgbGlua1xuICAgICogKGEgd2F5IHRvIGRldGVjdCBiYWNrIGhpc3RvcnkgYnV0dG9uIGFzIHdlIHBsYXkgd2l0aCB0aGUgaGFzaGVzIG9uIHRoZSBVUkwpXG4gICAgKi9cblxuXG4gICAgZnVuY3Rpb24gaGFzaENoYW5nZUhhbmRsZXIoKSB7XG4gICAgICBpZiAoIXN0YXRlLmlzU2Nyb2xsaW5nICYmICFnZXRPcHRpb25zKCkubG9ja0FuY2hvcnMpIHtcbiAgICAgICAgdmFyIGFuY2hvcnMgPSBnZXRBbmNob3JzVVJMKCk7XG4gICAgICAgIHZhciBzZWN0aW9uQW5jaG9yID0gYW5jaG9ycy5zZWN0aW9uO1xuICAgICAgICB2YXIgc2xpZGVBbmNob3IgPSBhbmNob3JzLnNsaWRlOyAvL3doZW4gbW92aW5nIHRvIGEgc2xpZGUgaW4gdGhlIGZpcnN0IHNlY3Rpb24gZm9yIHRoZSBmaXJzdCB0aW1lIChmaXJzdCB0aW1lIHRvIGFkZCBhbiBhbmNob3IgdG8gdGhlIFVSTClcblxuICAgICAgICB2YXIgaXNGaXJzdFNsaWRlTW92ZSA9IHR5cGVvZiBzdGF0ZS5sYXN0U2Nyb2xsZWREZXN0aW55ID09PSAndW5kZWZpbmVkJztcbiAgICAgICAgdmFyIGlzRmlyc3RTY3JvbGxNb3ZlID0gdHlwZW9mIHN0YXRlLmxhc3RTY3JvbGxlZERlc3RpbnkgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBzbGlkZUFuY2hvciA9PT0gJ3VuZGVmaW5lZCcgJiYgIXN0YXRlLnNsaWRlTW92aW5nO1xuXG4gICAgICAgIGlmIChzZWN0aW9uQW5jaG9yICYmIHNlY3Rpb25BbmNob3IubGVuZ3RoKSB7XG4gICAgICAgICAgLyppbiBvcmRlciB0byBjYWxsIHNjcm9sbHBhZ2UoKSBvbmx5IG9uY2UgZm9yIGVhY2ggZGVzdGluYXRpb24gYXQgYSB0aW1lXG4gICAgICAgICAgSXQgaXMgY2FsbGVkIHR3aWNlIGZvciBlYWNoIHNjcm9sbCBvdGhlcndpc2UsIGFzIGluIGNhc2Ugb2YgdXNpbmcgYW5jaG9ybGlua3MgYGhhc2hDaGFuZ2VgXG4gICAgICAgICAgZXZlbnQgaXMgZmlyZWQgb24gZXZlcnkgc2Nyb2xsIHRvby4qL1xuICAgICAgICAgIGlmIChzZWN0aW9uQW5jaG9yICYmIHNlY3Rpb25BbmNob3IgIT09IHN0YXRlLmxhc3RTY3JvbGxlZERlc3RpbnkgJiYgIWlzRmlyc3RTbGlkZU1vdmUgfHwgaXNGaXJzdFNjcm9sbE1vdmUgfHwgIXN0YXRlLnNsaWRlTW92aW5nICYmIHN0YXRlLmxhc3RTY3JvbGxlZFNsaWRlICE9IHNsaWRlQW5jaG9yKSB7XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdChldmVudHMub25TY3JvbGxQYWdlQW5kU2xpZGUsIHtcbiAgICAgICAgICAgICAgc2VjdGlvbkFuY2hvcjogc2VjdGlvbkFuY2hvcixcbiAgICAgICAgICAgICAgc2xpZGVBbmNob3I6IHNsaWRlQW5jaG9yXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRzLmJpbmRFdmVudHMsIGJpbmRFdmVudHMkNCk7XG5cbiAgICBmdW5jdGlvbiBiaW5kRXZlbnRzJDQoKSB7XG4gICAgICBkb2NBZGRFdmVudCgnd2hlZWwnLCB3aGVlbERhdGFIYW5kbGVyLnJlZ2lzdGVyRXZlbnQsIGdldFBhc3NpdmVPcHRpb25zSWZQb3NzaWJsZSgpKTtcbiAgICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMuc2Nyb2xsQmV5b25kRnVsbHBhZ2UsIHNjcm9sbEJleW9uZEZ1bGxQYWdlKTtcbiAgICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMub25LZXlEb3duLCBvbktleURvd24pO1xuICAgIH1cblxuICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMuYmluZEV2ZW50cywgYmluZEV2ZW50cyQzKTtcblxuICAgIGZ1bmN0aW9uIGJpbmRFdmVudHMkMygpIHtcbiAgICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMub25DbGlja09yVG91Y2gsIG9uQ2xpY2tPclRvdWNoJDEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQ2xpY2tPclRvdWNoJDEocGFyYW1zKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gcGFyYW1zLnRhcmdldDtcblxuICAgICAgaWYgKGNsb3Nlc3QodGFyZ2V0LCBnZXRPcHRpb25zKCkubWVudSArICcgW2RhdGEtbWVudWFuY2hvcl0nKSkge1xuICAgICAgICBtZW51SXRlbXNIYW5kbGVyLmNhbGwodGFyZ2V0LCBwYXJhbXMpO1xuICAgICAgfVxuICAgIH0gLy9NZW51IGl0ZW0gaGFuZGxlciB3aGVuIG5vdCB1c2luZyBhbmNob3JzIG9yIHVzaW5nIGxvY2tBbmNob3JzOnRydWVcblxuXG4gICAgZnVuY3Rpb24gbWVudUl0ZW1zSGFuZGxlcihlKSB7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFRyaWdnZXI6ICdtZW51J1xuICAgICAgfSk7XG5cbiAgICAgIGlmICgkKGdldE9wdGlvbnMoKS5tZW51KVswXSAmJiAoZ2V0T3B0aW9ucygpLmxvY2tBbmNob3JzIHx8ICFnZXRPcHRpb25zKCkuYW5jaG9ycy5sZW5ndGgpKSB7XG4gICAgICAgIHByZXZlbnREZWZhdWx0KGUpO1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50cy5vbk1lbnVDbGljaywge1xuICAgICAgICAgIGFuY2hvcjogZ2V0QXR0cih0aGlzLCAnZGF0YS1tZW51YW5jaG9yJylcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50cy5iaW5kRXZlbnRzLCBiaW5kRXZlbnRzJDIpO1xuXG4gICAgZnVuY3Rpb24gYmluZEV2ZW50cyQyKCkge1xuICAgICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50cy5vbkNsaWNrT3JUb3VjaCwgb25DbGlja09yVG91Y2gpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQ2xpY2tPclRvdWNoKHBhcmFtcykge1xuICAgICAgdmFyIHRhcmdldCA9IHBhcmFtcy50YXJnZXQ7XG5cbiAgICAgIGlmICh0YXJnZXQgJiYgY2xvc2VzdCh0YXJnZXQsIFNFQ1RJT05fTkFWX1NFTCArICcgYScpKSB7XG4gICAgICAgIHNlY3Rpb25CdWxsZXRIYW5kbGVyLmNhbGwodGFyZ2V0LCBwYXJhbXMuZSk7XG4gICAgICB9IGVsc2UgaWYgKG1hdGNoZXModGFyZ2V0LCBTRUNUSU9OX05BVl9UT09MVElQX1NFTCkpIHtcbiAgICAgICAgdG9vbHRpcFRleHRIYW5kbGVyLmNhbGwodGFyZ2V0KTtcbiAgICAgIH0gZWxzZSBpZiAobWF0Y2hlcyh0YXJnZXQsIFNMSURFU19OQVZfTElOS19TRUwpIHx8IGNsb3Nlc3QodGFyZ2V0LCBTTElERVNfTkFWX0xJTktfU0VMKSAhPSBudWxsKSB7XG4gICAgICAgIHNsaWRlQnVsbGV0SGFuZGxlci5jYWxsKHRhcmdldCwgcGFyYW1zLmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsYXN0U2Nyb2xsID0gMDtcbiAgICB2YXIgZ19zY3JvbGxJZDtcbiAgICB2YXIgZ19zY3JvbGxJZDI7XG4gICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50cy5vbkRlc3Ryb3ksIG9uRGVzdHJveSQxKTsgLy93aGVuIHNjcm9sbGluZy4uLlxuXG4gICAgZnVuY3Rpb24gc2Nyb2xsSGFuZGxlcihlKSB7XG4gICAgICB2YXIgY3VycmVudFNlY3Rpb247XG4gICAgICB2YXIgY3VycmVudFNlY3Rpb25FbGVtO1xuXG4gICAgICBpZiAoc3RhdGUuaXNSZXNpemluZyB8fCAhZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZ2V0TGFzdChnZXRTdGF0ZSgpLnNlY3Rpb25zKTtcblxuICAgICAgaWYgKGdldFN0YXRlKCkuaXNCZXlvbmRGdWxscGFnZSB8fCBnZXRTdGF0ZSgpLmlzQWJvdXRUb1Njcm9sbFRvRnVsbFBhZ2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWdldE9wdGlvbnMoKS5hdXRvU2Nyb2xsaW5nIHx8IGdldE9wdGlvbnMoKS5zY3JvbGxCYXIpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRTY3JvbGwgPSBnZXRTY3JvbGxUb3AoKTtcbiAgICAgICAgdmFyIHNjcm9sbERpcmVjdGlvbiA9IGdldFNjcm9sbERpcmVjdGlvbihjdXJyZW50U2Nyb2xsKTtcbiAgICAgICAgdmFyIHZpc2libGVTZWN0aW9uSW5kZXggPSAwO1xuICAgICAgICB2YXIgc2NyZWVuX21pZCA9IGN1cnJlbnRTY3JvbGwgKyBnZXRXaW5kb3dIZWlnaHQoKSAvIDIuMDtcbiAgICAgICAgdmFyIGlzQXRCb3R0b20gPSAkYm9keS5zY3JvbGxIZWlnaHQgLSBnZXRXaW5kb3dIZWlnaHQoKSA9PT0gY3VycmVudFNjcm9sbDtcbiAgICAgICAgdmFyIHNlY3Rpb25zID0gZ2V0U3RhdGUoKS5zZWN0aW9ucztcbiAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgIHNjcm9sbFk6IGN1cnJlbnRTY3JvbGxcbiAgICAgICAgfSk7IC8vd2hlbiB1c2luZyBgYXV0by1oZWlnaHRgIGZvciBhIHNtYWxsIGxhc3Qgc2VjdGlvbiBpdCB3b24ndCBiZSBjZW50ZXJlZCBpbiB0aGUgdmlld3BvcnRcblxuICAgICAgICBpZiAoaXNBdEJvdHRvbSkge1xuICAgICAgICAgIHZpc2libGVTZWN0aW9uSW5kZXggPSBzZWN0aW9ucy5sZW5ndGggLSAxO1xuICAgICAgICB9IC8vaXMgYXQgdG9wPyB3aGVuIHVzaW5nIGBhdXRvLWhlaWdodGAgZm9yIGEgc21hbGwgZmlyc3Qgc2VjdGlvbiBpdCB3b24ndCBiZSBjZW50ZXJlZCBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAgZWxzZSBpZiAoIWN1cnJlbnRTY3JvbGwpIHtcbiAgICAgICAgICB2aXNpYmxlU2VjdGlvbkluZGV4ID0gMDtcbiAgICAgICAgfSAvL3Rha2luZyB0aGUgc2VjdGlvbiB3aGljaCBpcyBzaG93aW5nIG1vcmUgY29udGVudCBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9ucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIHNlY3Rpb24gPSBzZWN0aW9uc1tpXS5pdGVtOyAvLyBQaWNrIHRoZSB0aGUgbGFzdCBzZWN0aW9uIHdoaWNoIHBhc3NlcyB0aGUgbWlkZGxlIGxpbmUgb2YgdGhlIHNjcmVlbi5cblxuICAgICAgICAgICAgaWYgKHNlY3Rpb24ub2Zmc2V0VG9wIDw9IHNjcmVlbl9taWQpIHtcbiAgICAgICAgICAgICAgdmlzaWJsZVNlY3Rpb25JbmRleCA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQ29tcGxldGVseUluVmlld1BvcnQoc2Nyb2xsRGlyZWN0aW9uKSkge1xuICAgICAgICAgIGlmICghaGFzQ2xhc3MoZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uLml0ZW0sIENPTVBMRVRFTFkpKSB7XG4gICAgICAgICAgICBhZGRDbGFzcyhnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb24uaXRlbSwgQ09NUExFVEVMWSk7XG4gICAgICAgICAgICByZW1vdmVDbGFzcyhzaWJsaW5ncyhnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb24uaXRlbSksIENPTVBMRVRFTFkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvL2dldGluZyB0aGUgbGFzdCBvbmUsIHRoZSBjdXJyZW50IG9uZSBvbiB0aGUgc2NyZWVuXG5cblxuICAgICAgICBjdXJyZW50U2VjdGlvbiA9IHNlY3Rpb25zW3Zpc2libGVTZWN0aW9uSW5kZXhdO1xuICAgICAgICBjdXJyZW50U2VjdGlvbkVsZW0gPSBjdXJyZW50U2VjdGlvbi5pdGVtOyAvL3NldHRpbmcgdGhlIHZpc2libGUgc2VjdGlvbiBhcyBhY3RpdmUgd2hlbiBtYW51YWxseSBzY3JvbGxpbmdcbiAgICAgICAgLy9leGVjdXRpbmcgb25seSBvbmNlIHRoZSBmaXJzdCB0aW1lIHdlIHJlYWNoIHRoZSBzZWN0aW9uXG5cbiAgICAgICAgaWYgKCFjdXJyZW50U2VjdGlvbi5pc0FjdGl2ZSkge1xuICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgIGlzU2Nyb2xsaW5nOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIGxlYXZpbmdTZWN0aW9uID0gZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uLml0ZW07XG4gICAgICAgICAgdmFyIGxlYXZpbmdTZWN0aW9uSW5kZXggPSBnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb24uaW5kZXgoKSArIDE7XG4gICAgICAgICAgdmFyIHlNb3ZlbWVudCA9IGdldFltb3ZlbWVudChnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb24sIGN1cnJlbnRTZWN0aW9uRWxlbSk7XG4gICAgICAgICAgdmFyIGFuY2hvckxpbmsgPSBjdXJyZW50U2VjdGlvbi5hbmNob3I7XG4gICAgICAgICAgdmFyIHNlY3Rpb25JbmRleCA9IGN1cnJlbnRTZWN0aW9uLmluZGV4KCkgKyAxO1xuICAgICAgICAgIHZhciBhY3RpdmVTbGlkZSA9IGN1cnJlbnRTZWN0aW9uLmFjdGl2ZVNsaWRlO1xuICAgICAgICAgIHZhciBzbGlkZUluZGV4O1xuICAgICAgICAgIHZhciBzbGlkZUFuY2hvckxpbms7XG4gICAgICAgICAgdmFyIGNhbGxiYWNrc1BhcmFtcyA9IHtcbiAgICAgICAgICAgIGFjdGl2ZVNlY3Rpb246IGxlYXZpbmdTZWN0aW9uLFxuICAgICAgICAgICAgc2VjdGlvbkluZGV4OiBzZWN0aW9uSW5kZXggLSAxLFxuICAgICAgICAgICAgYW5jaG9yTGluazogYW5jaG9yTGluayxcbiAgICAgICAgICAgIGVsZW1lbnQ6IGN1cnJlbnRTZWN0aW9uRWxlbSxcbiAgICAgICAgICAgIGxlYXZpbmdTZWN0aW9uOiBsZWF2aW5nU2VjdGlvbkluZGV4LFxuICAgICAgICAgICAgZGlyZWN0aW9uOiB5TW92ZW1lbnQsXG4gICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICBvcmlnaW46IGdldFN0YXRlKCkuYWN0aXZlU2VjdGlvbixcbiAgICAgICAgICAgICAgZGVzdGluYXRpb246IGN1cnJlbnRTZWN0aW9uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChhY3RpdmVTbGlkZSkge1xuICAgICAgICAgICAgc2xpZGVBbmNob3JMaW5rID0gYWN0aXZlU2xpZGUuYW5jaG9yO1xuICAgICAgICAgICAgc2xpZGVJbmRleCA9IGFjdGl2ZVNsaWRlLmluZGV4KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0YXRlLmNhblNjcm9sbCkge1xuICAgICAgICAgICAgYWRkQ2xhc3MoY3VycmVudFNlY3Rpb25FbGVtLCBBQ1RJVkUpO1xuICAgICAgICAgICAgcmVtb3ZlQ2xhc3Moc2libGluZ3MoY3VycmVudFNlY3Rpb25FbGVtKSwgQUNUSVZFKTtcblxuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZ2V0T3B0aW9ucygpLmJlZm9yZUxlYXZlKSkge1xuICAgICAgICAgICAgICBmaXJlQ2FsbGJhY2tPbmNlUGVyU2Nyb2xsKCdiZWZvcmVMZWF2ZScsIGNhbGxiYWNrc1BhcmFtcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGdldE9wdGlvbnMoKS5vbkxlYXZlKSkge1xuICAgICAgICAgICAgICBmaXJlQ2FsbGJhY2soJ29uTGVhdmUnLCBjYWxsYmFja3NQYXJhbXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihnZXRPcHRpb25zKCkuYWZ0ZXJMb2FkKSkge1xuICAgICAgICAgICAgICBmaXJlQ2FsbGJhY2soJ2FmdGVyTG9hZCcsIGNhbGxiYWNrc1BhcmFtcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0b3BNZWRpYShsZWF2aW5nU2VjdGlvbik7XG4gICAgICAgICAgICBsYXp5TG9hZChjdXJyZW50U2VjdGlvbkVsZW0pO1xuICAgICAgICAgICAgcGxheU1lZGlhKGN1cnJlbnRTZWN0aW9uRWxlbSk7XG4gICAgICAgICAgICBhY3RpdmF0ZU1lbnVBbmROYXYoYW5jaG9yTGluaywgc2VjdGlvbkluZGV4IC0gMSk7XG5cbiAgICAgICAgICAgIGlmIChnZXRPcHRpb25zKCkuYW5jaG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgLy9uZWVkZWQgdG8gZW50ZXIgaW4gaGFzaENoYW5nZSBldmVudCB3aGVuIHVzaW5nIHRoZSBtZW51IHdpdGggYW5jaG9yIGxpbmtzXG4gICAgICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBsYXN0U2Nyb2xsZWREZXN0aW55OiBhbmNob3JMaW5rXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1cGRhdGVTdGF0ZSgpO1xuICAgICAgICAgICAgc2V0UGFnZVN0YXR1cyhzbGlkZUluZGV4LCBzbGlkZUFuY2hvckxpbmssIGFuY2hvckxpbmspO1xuICAgICAgICAgIH0gLy9zbWFsbCB0aW1lb3V0IGluIG9yZGVyIHRvIGF2b2lkIGVudGVyaW5nIGluIGhhc2hDaGFuZ2UgZXZlbnQgd2hlbiBzY3JvbGxpbmcgaXMgbm90IGZpbmlzaGVkIHlldFxuXG5cbiAgICAgICAgICBjbGVhclRpbWVvdXQoZ19zY3JvbGxJZCk7XG4gICAgICAgICAgZ19zY3JvbGxJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBpc1Njcm9sbGluZzogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ2V0T3B0aW9ucygpLmZpdFRvU2VjdGlvbiAmJiBzdGF0ZS5jYW5TY3JvbGwpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoZ19zY3JvbGxJZDIpO1xuICAgICAgICAgIGdfc2Nyb2xsSWQyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZml4ZWRTZWN0aW9ucyA9IHN0YXRlLnNlY3Rpb25zLmZpbHRlcihmdW5jdGlvbiAoc2VjdGlvbikge1xuICAgICAgICAgICAgICB2YXIgc2VjdGlvblZhbHVlcyA9IHNlY3Rpb24uaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoc2VjdGlvblZhbHVlcy5ib3R0b20pID09PSBNYXRoLnJvdW5kKGdldFdpbmRvd0hlaWdodCgpKSB8fCBNYXRoLnJvdW5kKHNlY3Rpb25WYWx1ZXMudG9wKSA9PT0gMDtcbiAgICAgICAgICAgIH0pOyAvLyBObyBzZWN0aW9uIGlzIGZpdHRpbmcgdGhlIHZpZXdwb3J0PyBMZXQncyBmaXggdGhhdCFcblxuICAgICAgICAgICAgaWYgKCFmaXhlZFNlY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICBmaXRUb1NlY3Rpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBnZXRPcHRpb25zKCkuZml0VG9TZWN0aW9uRGVsYXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25EZXN0cm95JDEoKSB7XG4gICAgICBjbGVhclRpbWVvdXQoZ19zY3JvbGxJZCk7XG4gICAgICBjbGVhclRpbWVvdXQoZ19zY3JvbGxJZDIpO1xuICAgIH1cbiAgICAvKipcbiAgICAqIEdldHMgdGhlIGRpcmVjdG9uIG9mIHRoZSB0aGUgc2Nyb2xsaW5nIGZpcmVkIGJ5IHRoZSBzY3JvbGwgZXZlbnQuXG4gICAgKi9cblxuXG4gICAgZnVuY3Rpb24gZ2V0U2Nyb2xsRGlyZWN0aW9uKGN1cnJlbnRTY3JvbGwpIHtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSBjdXJyZW50U2Nyb2xsID4gbGFzdFNjcm9sbCA/ICdkb3duJyA6ICd1cCc7XG4gICAgICBsYXN0U2Nyb2xsID0gY3VycmVudFNjcm9sbDsgLy9uZWVkZWQgZm9yIGF1dG8taGVpZ2h0IHNlY3Rpb25zIHRvIGRldGVybWluZSBpZiB3ZSB3YW50IHRvIHNjcm9sbCB0byB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgZGVzdGluYXRpb25cblxuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICBwcmV2aW91c0Rlc3RUb3A6IGN1cnJlbnRTY3JvbGxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRpcmVjdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFjdGl2ZSBzZWN0aW9uIGhhcyBzZWVuIGluIGl0cyB3aG9sZSBvciBub3QuXG4gICAgKi9cblxuXG4gICAgZnVuY3Rpb24gaXNDb21wbGV0ZWx5SW5WaWV3UG9ydChtb3ZlbWVudCkge1xuICAgICAgdmFyIHRvcCA9IGdldFN0YXRlKCkuYWN0aXZlU2VjdGlvbi5pdGVtLm9mZnNldFRvcDtcbiAgICAgIHZhciBib3R0b20gPSB0b3AgKyBnZXRXaW5kb3dIZWlnaHQoKTtcblxuICAgICAgaWYgKG1vdmVtZW50ID09ICd1cCcpIHtcbiAgICAgICAgcmV0dXJuIGJvdHRvbSA+PSBnZXRTY3JvbGxUb3AoKSArIGdldFdpbmRvd0hlaWdodCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG9wIDw9IGdldFNjcm9sbFRvcCgpO1xuICAgIH1cblxuICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMuYmluZEV2ZW50cywgYmluZEV2ZW50cyQxKTtcbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRzLm9uRGVzdHJveSwgb25EZXN0cm95KTtcblxuICAgIGZ1bmN0aW9uIG9uRGVzdHJveSgpIHtcbiAgICAgIHdpbmRvd1JlbW92ZUV2ZW50KCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBiaW5kRXZlbnRzJDEoKSB7XG4gICAgICB3aW5kb3dBZGRFdmVudCgnc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcik7XG4gICAgICBkb2MuYm9keS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKTtcbiAgICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMub25TY3JvbGxQYWdlQW5kU2xpZGUsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgc2Nyb2xsUGFnZUFuZFNsaWRlKHBhcmFtcy5zZWN0aW9uQW5jaG9yLCBwYXJhbXMuc2xpZGVBbmNob3IpO1xuICAgICAgfSk7XG4gICAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRzLm9uTWVudUNsaWNrLCBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIG1vdmVUbyQxKHBhcmFtcy5hbmNob3IsIHVuZGVmaW5lZCk7XG4gICAgICB9KTtcbiAgICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMub25TY3JvbGxPdmVyZmxvd1Njcm9sbGVkLCBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBzY3JvbGxTZWN0aW9uID0gcGFyYW1zLmRpcmVjdGlvbiA9PT0gJ2Rvd24nID8gbW92ZVNlY3Rpb25Eb3duIDogbW92ZVNlY3Rpb25VcDtcbiAgICAgICAgc2Nyb2xsU2VjdGlvbigpO1xuICAgICAgfSk7XG4gICAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRzLnNjcm9sbFBhZ2UsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgc2Nyb2xsUGFnZShwYXJhbXMuZGVzdGluYXRpb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgRlAuZ2V0QWN0aXZlU2xpZGUgPSBnZXRBY3RpdmVTbGlkZTtcblxuICAgIEZQLmdldFNjcm9sbFggPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc3RhdGUuc2Nyb2xsWDtcbiAgICB9O1xuXG4gICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50cy5iaW5kRXZlbnRzLCBiaW5kRXZlbnRzKTtcblxuICAgIGZ1bmN0aW9uIGJpbmRFdmVudHMoKSB7XG4gICAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRzLm9uRGVzdHJveSwgb25EZXN0cm95JDYpO1xuICAgICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50cy5sYW5kc2NhcGVTY3JvbGwsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgbGFuZHNjYXBlU2Nyb2xsKHBhcmFtcy5zbGlkZXMsIHBhcmFtcy5kZXN0aW5hdGlvbik7XG4gICAgICB9KTtcbiAgICAgIEV2ZW50RW1pdHRlci5vbihldmVudHMubW92ZVNsaWRlUmlnaHQsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgbW92ZVNsaWRlUmlnaHQocGFyYW1zLnNlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRzLm1vdmVTbGlkZUxlZnQsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgbW92ZVNsaWRlTGVmdChwYXJhbXMuc2VjdGlvbik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBHZXRzIHRoZSBhY3RpdmUgc2xpZGUuXG4gICAgKi9cblxuXG4gICAgZnVuY3Rpb24gZ2V0QWN0aXZlU2xpZGUoKSB7XG4gICAgICByZXR1cm4gbnVsbE9yU2xpZGUoZ2V0U3RhdGUoKS5hY3RpdmVTZWN0aW9uLmFjdGl2ZVNsaWRlKTtcbiAgICB9XG5cbiAgICBFdmVudEVtaXR0ZXIub24oZXZlbnRzLmJpbmRFdmVudHMsIGluaXQkMSk7XG5cbiAgICBmdW5jdGlvbiBpbml0JDEoKSB7XG4gICAgICB2YXIgcG9zaXRpb24gPSBnZXRPcHRpb25zKCkuY3JlZGl0cy5wb3NpdGlvbiB8fCAncmlnaHQnO1xuICAgICAgdmFyIHBvc2l0aW9uU3R5bGUgPSBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKHBvc2l0aW9uKSA+IC0xID8gXCJcIi5jb25jYXQocG9zaXRpb24sIFwiOiAwO1wiKSA6ICcnO1xuICAgICAgdmFyIHdhdGVyTWFyayA9IFwiXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmcC13YXRlcm1hcmtcXFwiIHN0eWxlPVxcXCJcIi5jb25jYXQocG9zaXRpb25TdHlsZSwgXCJcXFwiPlxcbiAgICAgICAgICAgIDxhIGhyZWY9XFxcImh0dHBzOi8vYWx2YXJvdHJpZ28uY29tL2Z1bGxQYWdlL1xcXCIgXFxuICAgICAgICAgICAgICAgIHJlbD1cXFwibm9mb2xsb3cgbm9vcGVuZXJcXFwiIFxcbiAgICAgICAgICAgICAgICB0YXJnZXQ9XFxcIl9ibGFua1xcXCIgXFxuICAgICAgICAgICAgICAgIHN0eWxlPVxcXCJ0ZXh0LWRlY29yYXRpb246bm9uZTsgY29sb3I6ICMwMDA7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIFwiKS5jb25jYXQoZ2V0T3B0aW9ucygpLmNyZWRpdHMubGFiZWwgfHwgJ01hZGUgd2l0aCBmdWxsUGFnZS5qcycsIFwiXFxuICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIFwiKTtcbiAgICAgIHZhciBsYXN0U2VjdGlvbiA9IGdldExhc3Qoc3RhdGUuc2VjdGlvbnMpO1xuICAgICAgdmFyIHNob3VsZFVzZVdhdGVyTWFyayA9ICFzdGF0ZS5pc1ZhbGlkIHx8IGdldE9wdGlvbnMoKS5jcmVkaXRzLmVuYWJsZWQ7XG5cbiAgICAgIGlmIChsYXN0U2VjdGlvbiAmJiBsYXN0U2VjdGlvbi5pdGVtICYmIHNob3VsZFVzZVdhdGVyTWFyaykge1xuICAgICAgICBsYXN0U2VjdGlvbi5pdGVtLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgd2F0ZXJNYXJrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAhZnVuY3Rpb24gKCkge1xuICAgICAgRXZlbnRFbWl0dGVyLm9uKGV2ZW50cy5vbkluaXRpYWxpc2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG4sIGEsIGw7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBpc1ZhbGlkOiAoZ2V0T3B0aW9ucygpLmxpY2Vuc2VLZXksIG4gPSBnZXRPcHRpb25zKCkubGljZW5zZUtleSwgYSA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICB2YXIgZSA9IHBhcnNlSW50KFwiXFx4MzVcXHgzMVxceDM0XCIpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIGlmICghbiB8fCBuLmxlbmd0aCA8IDI5IHx8IDQgPT09IG4uc3BsaXQodFswXSkubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHZhciByID0gW1wiXFx4NDVcXHg2MVxceDYzXFx4NjhcIiwgXCJcXHg2NlxceDZmXFx4NzJcIl1baSgpXSgpLmpvaW4oXCJcIiksXG4gICAgICAgICAgICAgICAgYSA9IG5bW1wiXFx4NzNcXHg3MFxceDZjXFx4NjlcXHg3NFwiXV0oXCItXCIpLFxuICAgICAgICAgICAgICAgIGwgPSBbXTtcbiAgICAgICAgICAgIGFbcl0oZnVuY3Rpb24gKHQsIG4pIHtcbiAgICAgICAgICAgICAgaWYgKG4gPCA0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHIgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0W3QubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgICAgICAgICAgICAgZSA9IFtcIlxceDRlXFx4NjFcXHg0ZVwiLCBcIlxceDY5XFx4NzNcIl1baSgpXSgpLmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93W2VdKG4pID8gbyhuKSA6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0IC0gQUNUSVZFLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgIH0obik7XG4gICAgICAgICAgICAgICAgfSh0KTtcblxuICAgICAgICAgICAgICAgIGwucHVzaChyKTtcbiAgICAgICAgICAgICAgICB2YXIgcyA9IG8odFtyXSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoMSA9PT0gbikge1xuICAgICAgICAgICAgICAgICAgdmFyIGEgPSBbXCJcXHg3MFxceDYxXCIsIFwiXFx4NjRcXHg1M1wiLCBcIlxceDc0XCIsIFwiXFx4NjFcXHg3MlxceDc0XCJdLmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgICBzID0gcy50b1N0cmluZygpW2FdKDIsIFwiMFwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlICs9IHMsIDAgIT09IG4gJiYgMSAhPT0gbiB8fCAoZSArPSBcIi1cIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIG0gPSAwLFxuICAgICAgICAgICAgICAgIGYgPSBcIlwiO1xuICAgICAgICAgICAgcmV0dXJuIG4uc3BsaXQoXCItXCIpLmZvckVhY2goZnVuY3Rpb24gKHQsIG4pIHtcbiAgICAgICAgICAgICAgaWYgKG4gPCA0KSB7XG4gICAgICAgICAgICAgICAgdmFyIF9pID0gMDtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgNDsgZSsrKSB7XG4gICAgICAgICAgICAgICAgICBlICE9PSBsW25dICYmIChfaSArPSBNYXRoLmFicyhvKHRbZV0pKSwgaXNOYU4odFtlXSkgfHwgbSsrKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgciA9IHMoX2kpO1xuICAgICAgICAgICAgICAgIGYgKz0gcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksIGYgKz0gcyhtKSwge1xuICAgICAgICAgICAgICB2OiBuZXcgRGF0ZShlICsgXCJUMDA6MDBcIiksXG4gICAgICAgICAgICAgIG86IGUuc3BsaXQoXCItXCIpWzJdID09PSA4ICogKEFDVElWRS5sZW5ndGggLSAyKSArIFwiXCIsXG4gICAgICAgICAgICAgIGw6IGZcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfShuKSwgbCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICB2YXIgbiA9IHJbaSgpXSgpLmpvaW4oXCJcIik7XG4gICAgICAgICAgICByZXR1cm4gdCAmJiAwID09PSBuLmluZGV4T2YodCkgJiYgdC5sZW5ndGggPT09IG4ubGVuZ3RoO1xuICAgICAgICAgIH0obiksIChhIHx8IGwpICYmIChhICYmIGUgPD0gYS52ICYmIGEubCA9PT0gbi5zcGxpdCh0WzBdKVs0XSB8fCBsIHx8IGEubykgfHwgITEpXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB2YXIgdCA9IFtcIi1cIl07XG4gICAgICB2YXIgbiA9IFwiXFx4MzJcXHgzMFxceDMyXFx4MzNcXHgyZFxceDM0XFx4MmRcXHgzMlxceDM5XCIuc3BsaXQoXCItXCIpLFxuICAgICAgICAgIGUgPSBuZXcgRGF0ZShuWzBdLCBuWzFdLCBuWzJdKSxcbiAgICAgICAgICByID0gW1wic2VcIiwgXCJsaWNlblwiLCBcIi1cIiwgXCJ2M1wiLCBcImxcIiwgXCJncFwiXTtcblxuICAgICAgZnVuY3Rpb24gaSgpIHtcbiAgICAgICAgcmV0dXJuIFtbXCJcXHg3MlxceDY1XCIsIFwiXFx4NzZcXHg2NVxceDcyXFx4NzNcXHg2NVwiXS5qb2luKFwiXCIpXVtcIlwiLmxlbmd0aF07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG8odCkge1xuICAgICAgICByZXR1cm4gdCA/IGlzTmFOKHQpID8gdC5jaGFyQ29kZUF0KDApIC0gNzIgOiB0IDogXCJcIjtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcyh0KSB7XG4gICAgICAgIHZhciBuID0gNzIgKyB0O1xuICAgICAgICByZXR1cm4gbiA+IDkwICYmIG4gPCA5NyAmJiAobiArPSAxNSksIFN0cmluZy5mcm9tQ2hhckNvZGUobikudG9VcHBlckNhc2UoKTtcbiAgICAgIH1cbiAgICB9KCk7XG5cbiAgICAvL0B0cy1jaGVja1xuICAgIEZQLnNldEtleWJvYXJkU2Nyb2xsaW5nID0gc2V0S2V5Ym9hcmRTY3JvbGxpbmc7XG4gICAgLyoqXG4gICAgKiBBZGRzIG9yIHJlbW92ZSB0aGUgcG9zc2liaWxpdHkgb2Ygc2Nyb2xsaW5nIHRocm91Z2ggc2VjdGlvbnMgYnkgdXNpbmcgdGhlIGtleWJvYXJkIGFycm93IGtleXNcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gc2V0S2V5Ym9hcmRTY3JvbGxpbmcodmFsdWUsIGRpcmVjdGlvbnMpIHtcbiAgICAgIGlmICh0eXBlb2YgZGlyZWN0aW9ucyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZGlyZWN0aW9ucyA9IGRpcmVjdGlvbnMucmVwbGFjZSgvIC9nLCAnJykuc3BsaXQoJywnKTtcbiAgICAgICAgZGlyZWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICBzZXRJc1Njcm9sbEFsbG93ZWQodmFsdWUsIGRpcmVjdGlvbiwgJ2snKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRJc1Njcm9sbEFsbG93ZWQodmFsdWUsICdhbGwnLCAnaycpO1xuICAgICAgICBnZXRPcHRpb25zKCkua2V5Ym9hcmRTY3JvbGxpbmcgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFNldHMgdGhlIGRhdGEtYW5jaG9yIGF0dHJpYnV0ZXMgdG8gdGhlIG1lbnUgZWxlbWVudHMgYW5kIGFjdGl2YXRlcyB0aGUgY3VycmVudCBvbmUuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHN0eWxlTWVudShzZWN0aW9uKSB7XG4gICAgICB2YXIgaW5kZXggPSBzZWN0aW9uLmluZGV4KCk7XG5cbiAgICAgIGlmICh0eXBlb2YgZ2V0T3B0aW9ucygpLmFuY2hvcnNbaW5kZXhdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvL2FjdGl2YXRpbmcgdGhlIG1lbnUgLyBuYXYgZWxlbWVudCBvbiBsb2FkXG4gICAgICAgIGlmIChzZWN0aW9uLmlzQWN0aXZlKSB7XG4gICAgICAgICAgYWN0aXZhdGVNZW51QW5kTmF2KGdldE9wdGlvbnMoKS5hbmNob3JzW2luZGV4XSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9IC8vbW92aW5nIHRoZSBtZW51IG91dHNpZGUgdGhlIG1haW4gY29udGFpbmVyIGlmIGl0IGlzIGluc2lkZSAoYXZvaWQgcHJvYmxlbXMgd2l0aCBmaXhlZCBwb3NpdGlvbnMgd2hlbiB1c2luZyBDU1MzIHRyYW5mb3JtcylcblxuXG4gICAgICBpZiAoZ2V0T3B0aW9ucygpLm1lbnUgJiYgZ2V0T3B0aW9ucygpLmNzczMgJiYgY2xvc2VzdCgkKGdldE9wdGlvbnMoKS5tZW51KVswXSwgV1JBUFBFUl9TRUwpICE9IG51bGwpIHtcbiAgICAgICAgJChnZXRPcHRpb25zKCkubWVudSkuZm9yRWFjaChmdW5jdGlvbiAobWVudSkge1xuICAgICAgICAgICRib2R5LmFwcGVuZENoaWxkKG1lbnUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFdvcmtzIG92ZXIgdGhlIERPTSBzdHJ1Y3R1cmUgdG8gc2V0IGl0IHVwIGZvciB0aGUgY3VycmVudCBmdWxscGFnZSBnZXRPcHRpb25zKCkuXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHByZXBhcmVEb20oKSB7XG4gICAgICBjc3MoZ2V0UGFyZW50c1VudGlsKGdldENvbnRhaW5lcigpLCAnYm9keScpLCB7XG4gICAgICAgICdoZWlnaHQnOiAnMTAwJScsXG4gICAgICAgICdwb3NpdGlvbic6ICdyZWxhdGl2ZSdcbiAgICAgIH0pOyAvL2FkZGluZyBhIGNsYXNzIHRvIHJlY29nbml6ZSB0aGUgY29udGFpbmVyIGludGVybmFsbHkgaW4gdGhlIGNvZGVcblxuICAgICAgYWRkQ2xhc3MoZ2V0Q29udGFpbmVyKCksIFdSQVBQRVIpO1xuICAgICAgYWRkQ2xhc3MoJGh0bWwsIEVOQUJMRUQpOyAvL2R1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vYWx2YXJvdHJpZ28vZnVsbFBhZ2UuanMvaXNzdWVzLzE1MDJcblxuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICB3aW5kb3dzSGVpZ2h0OiBnZXRXaW5kb3dIZWlnaHQoKVxuICAgICAgfSk7XG4gICAgICByZW1vdmVDbGFzcyhnZXRDb250YWluZXIoKSwgREVTVFJPWUVEKTsgLy9pbiBjYXNlIGl0IHdhcyBkZXN0cm95ZWQgYmVmb3JlIGluaXRpYWxpemluZyBpdCBhZ2FpblxuXG4gICAgICBhZGRJbnRlcm5hbFNlbGVjdG9ycygpO1xuICAgICAgdmFyIHNlY3Rpb25zID0gZ2V0U3RhdGUoKS5zZWN0aW9uc0luY2x1ZGluZ0hpZGRlbjsgLy9zdHlsaW5nIHRoZSBzZWN0aW9ucyAvIHNsaWRlcyAvIG1lbnVcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2VjdGlvbiA9IHNlY3Rpb25zW2ldO1xuICAgICAgICB2YXIgc2xpZGVzID0gc2VjdGlvbi5hbGxTbGlkZXNJdGVtczsgLy9jYWNoaW5nIHRoZSBvcmlnaW5hbCBzdHlsZXMgdG8gYWRkIHRoZW0gYmFjayBvbiBkZXN0cm95KCdhbGwnKVxuXG4gICAgICAgIHZhciBvcmlnaW5hbFN0eWxlcyA9IGdldEF0dHIoc2VjdGlvbi5pdGVtLCAnc3R5bGUnKTtcblxuICAgICAgICBpZiAob3JpZ2luYWxTdHlsZXMpIHtcbiAgICAgICAgICBzZWN0aW9uLml0ZW0uc2V0QXR0cmlidXRlKCdkYXRhLWZwLXN0eWxlcycsIG9yaWdpbmFsU3R5bGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlU2VjdGlvbihzZWN0aW9uKTtcbiAgICAgICAgc3R5bGVNZW51KHNlY3Rpb24pOyAvLyBpZiB0aGVyZSdzIGFueSBzbGlkZVxuXG4gICAgICAgIGlmIChzbGlkZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHN0eWxlU2xpZGVzKHNlY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9IC8vZml4ZWQgZWxlbWVudHMgbmVlZCB0byBiZSBtb3ZlZCBvdXQgb2YgdGhlIHBsdWdpbiBjb250YWluZXIgZHVlIHRvIHByb2JsZW1zIHdpdGggQ1NTMy5cblxuXG4gICAgICBpZiAoZ2V0T3B0aW9ucygpLmZpeGVkRWxlbWVudHMgJiYgZ2V0T3B0aW9ucygpLmNzczMpIHtcbiAgICAgICAgJChnZXRPcHRpb25zKCkuZml4ZWRFbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICRib2R5LmFwcGVuZENoaWxkKGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gLy92ZXJ0aWNhbCBjZW50ZXJlZCBvZiB0aGUgbmF2aWdhdGlvbiArIGFjdGl2ZSBidWxsZXRcblxuXG4gICAgICBpZiAoZ2V0T3B0aW9ucygpLm5hdmlnYXRpb24pIHtcbiAgICAgICAgYWRkVmVydGljYWxOYXZpZ2F0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIGVuYWJsZVlvdXR1YmVBUEkoKTtcblxuICAgICAgaWYgKGdldE9wdGlvbnMoKS5zY3JvbGxPdmVyZmxvdykge1xuICAgICAgICBzY3JvbGxPdmVyZmxvd0hhbmRsZXIubWFrZVNjcm9sbGFibGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBGUC5zaGFyZWQuYWZ0ZXJSZW5kZXJBY3Rpb25zID0gYWZ0ZXJSZW5kZXJBY3Rpb25zO1xuICAgIC8qKlxuICAgICogQWN0aW9ucyBhbmQgY2FsbGJhY2tzIHRvIGZpcmUgYWZ0ZXJSZW5kZXJcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gYWZ0ZXJSZW5kZXJBY3Rpb25zKCkge1xuICAgICAgdmFyIHNlY3Rpb24gPSBnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb247XG4gICAgICB2YXIgc2VjdGlvbkVsZW0gPSBnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb24uaXRlbTtcbiAgICAgIGFkZENsYXNzKHNlY3Rpb25FbGVtLCBDT01QTEVURUxZKTtcbiAgICAgIGxhenlMb2FkKHNlY3Rpb25FbGVtKTtcbiAgICAgIGxhenlMb2FkT3RoZXJzKCk7XG4gICAgICBwbGF5TWVkaWEoc2VjdGlvbkVsZW0pO1xuXG4gICAgICBpZiAoaXNEZXN0aW55VGhlU3RhcnRpbmdTZWN0aW9uKCkgJiYgaXNGdW5jdGlvbihnZXRPcHRpb25zKCkuYWZ0ZXJMb2FkKSkge1xuICAgICAgICBmaXJlQ2FsbGJhY2soJ2FmdGVyTG9hZCcsIHtcbiAgICAgICAgICBhY3RpdmVTZWN0aW9uOiBzZWN0aW9uRWxlbSxcbiAgICAgICAgICBlbGVtZW50OiBzZWN0aW9uRWxlbSxcbiAgICAgICAgICBkaXJlY3Rpb246IG51bGwsXG4gICAgICAgICAgLy9mb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY2FsbGJhY2sgKHRvIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUhKVxuICAgICAgICAgIGFuY2hvckxpbms6IHNlY3Rpb24uYW5jaG9yLFxuICAgICAgICAgIHNlY3Rpb25JbmRleDogc2VjdGlvbi5pbmRleCgpLFxuICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICBvcmlnaW46IGdldFN0YXRlKCkuYWN0aXZlU2VjdGlvbixcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBnZXRTdGF0ZSgpLmFjdGl2ZVNlY3Rpb25cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNGdW5jdGlvbihnZXRPcHRpb25zKCkuYWZ0ZXJSZW5kZXIpKSB7XG4gICAgICAgIGZpcmVDYWxsYmFjaygnYWZ0ZXJSZW5kZXInKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBVUkwgYW5jaG9yIGRlc3RpbnkgaXMgdGhlIHN0YXJ0aW5nIHNlY3Rpb24gKHRoZSBvbmUgdXNpbmcgJ2FjdGl2ZScgY2xhc3MgYmVmb3JlIGluaXRpYWxpemF0aW9uKVxuICAgICovXG5cbiAgICBmdW5jdGlvbiBpc0Rlc3RpbnlUaGVTdGFydGluZ1NlY3Rpb24oKSB7XG4gICAgICB2YXIgYW5jaG9yID0gZ2V0QW5jaG9yc1VSTCgpO1xuICAgICAgdmFyIGRlc3RpbmF0aW9uU2VjdGlvbiA9IGdldFNlY3Rpb25CeUFuY2hvcihhbmNob3Iuc2VjdGlvbik7XG4gICAgICByZXR1cm4gIWFuY2hvci5zZWN0aW9uIHx8ICFkZXN0aW5hdGlvblNlY3Rpb24gfHwgdHlwZW9mIGRlc3RpbmF0aW9uU2VjdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgZGVzdGluYXRpb25TZWN0aW9uLmluZGV4KCkgPT09IGluZGV4KGdldFN0YXJ0aW5nU2VjdGlvbigpKTtcbiAgICB9XG5cbiAgICBGUC5zZXRBbGxvd1Njcm9sbGluZyA9IHNldEFsbG93U2Nyb2xsaW5nO1xuICAgIC8qKlxuICAgICogQWRkcyBvciByZW1vdmUgdGhlIHBvc3NpYmlsaXR5IG9mIHNjcm9sbGluZyB0aHJvdWdoIHNlY3Rpb25zIGJ5IHVzaW5nIHRoZSBtb3VzZSB3aGVlbC90cmFja3BhZCBvciB0b3VjaCBnZXN0dXJlcy5cbiAgICAqIE9wdGlvbmFsbHkgYSBzZWNvbmQgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBmb3Igd2hpY2ggdGhlIGFjdGlvbiB3aWxsIGJlIGFwcGxpZWQuXG4gICAgKlxuICAgICogQHBhcmFtIGRpcmVjdGlvbnMgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRpcmVjdGlvbiBvciBkaXJlY3Rpb25zIHNlcGFyYXRlZCBieSBjb21tYS5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gc2V0QWxsb3dTY3JvbGxpbmcodmFsdWUsIGRpcmVjdGlvbnMpIHtcbiAgICAgIGlmICh0eXBlb2YgZGlyZWN0aW9ucyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZGlyZWN0aW9ucyA9IGRpcmVjdGlvbnMucmVwbGFjZSgvIC9nLCAnJykuc3BsaXQoJywnKTtcbiAgICAgICAgZGlyZWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICBzZXRJc1Njcm9sbEFsbG93ZWQodmFsdWUsIGRpcmVjdGlvbiwgJ20nKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRJc1Njcm9sbEFsbG93ZWQodmFsdWUsICdhbGwnLCAnbScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogU2Nyb2xscyB0byB0aGUgYW5jaG9yIGluIHRoZSBVUkwgd2hlbiBsb2FkaW5nIHRoZSBzaXRlXG4gICAgKi9cblxuICAgIGZ1bmN0aW9uIHNjcm9sbFRvQW5jaG9yKCkge1xuICAgICAgdmFyIGFuY2hvcnMgPSBnZXRBbmNob3JzVVJMKCk7XG4gICAgICB2YXIgc2VjdGlvbkFuY2hvciA9IGFuY2hvcnMuc2VjdGlvbjtcbiAgICAgIHZhciBzbGlkZUFuY2hvciA9IGFuY2hvcnMuc2xpZGU7XG5cbiAgICAgIGlmIChzZWN0aW9uQW5jaG9yKSB7XG4gICAgICAgIC8vaWYgdGhlcmVzIGFueSAjXG4gICAgICAgIGlmIChnZXRPcHRpb25zKCkuYW5pbWF0ZUFuY2hvcikge1xuICAgICAgICAgIHNjcm9sbFBhZ2VBbmRTbGlkZShzZWN0aW9uQW5jaG9yLCBzbGlkZUFuY2hvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2lsZW50TW92ZVRvKHNlY3Rpb25BbmNob3IsIHNsaWRlQW5jaG9yKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRzLm9uQWZ0ZXJSZW5kZXJOb0FuY2hvciwgbnVsbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLypcbiAgICAqIFJlbW92ZXMgaW5saW5lIHN0eWxlcyBhZGRlZCBieSBmdWxscGFnZS5qc1xuICAgICovXG5cbiAgICBmdW5jdGlvbiBkZXN0cm95U3RydWN0dXJlKCkge1xuICAgICAgLy9yZXNldGluZyB0aGUgYHRvcGAgb3IgYHRyYW5zbGF0ZWAgcHJvcGVydGllcyB0byAwXG4gICAgICBzaWxlbnRTY3JvbGwoMCk7IC8vbG9hZGluZyBhbGwgdGhlIGxhenkgbG9hZCBjb250ZW50XG5cbiAgICAgICQoJ2ltZ1tkYXRhLXNyY10sIHNvdXJjZVtkYXRhLXNyY10sIGF1ZGlvW2RhdGEtc3JjXSwgaWZyYW1lW2RhdGEtc3JjXScsIGdldENvbnRhaW5lcigpKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHNldFNyYyhpdGVtLCAnc3JjJyk7XG4gICAgICB9KTtcbiAgICAgICQoJ2ltZ1tkYXRhLXNyY3NldF0nKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHNldFNyYyhpdGVtLCAnc3Jjc2V0Jyk7XG4gICAgICB9KTtcbiAgICAgIHJlbW92ZSgkKFNFQ1RJT05fTkFWX1NFTCArICcsICcgKyBTTElERVNfTkFWX1NFTCArICcsICcgKyBTTElERVNfQVJST1dfU0VMKSk7IC8vcmVtb3ZpbmcgaW5saW5lIHN0eWxlc1xuXG4gICAgICBjc3MoZ2V0Tm9kZXMoZ2V0U3RhdGUoKS5zZWN0aW9ucyksIHtcbiAgICAgICAgJ2hlaWdodCc6ICcnLFxuICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcnLFxuICAgICAgICAncGFkZGluZyc6ICcnXG4gICAgICB9KTtcbiAgICAgIGNzcyhnZXROb2RlcyhnZXRTdGF0ZSgpLnNsaWRlcyksIHtcbiAgICAgICAgJ3dpZHRoJzogJydcbiAgICAgIH0pO1xuICAgICAgY3NzKGdldENvbnRhaW5lcigpLCB7XG4gICAgICAgICdoZWlnaHQnOiAnJyxcbiAgICAgICAgJ3Bvc2l0aW9uJzogJycsXG4gICAgICAgICctbXMtdG91Y2gtYWN0aW9uJzogJycsXG4gICAgICAgICd0b3VjaC1hY3Rpb24nOiAnJ1xuICAgICAgfSk7XG4gICAgICBjc3MoJGh0bWxCb2R5LCB7XG4gICAgICAgICdvdmVyZmxvdyc6ICcnLFxuICAgICAgICAnaGVpZ2h0JzogJydcbiAgICAgIH0pOyAvLyByZW1vdmUgLmZwLWVuYWJsZWQgY2xhc3NcblxuICAgICAgcmVtb3ZlQ2xhc3MoJGh0bWwsIEVOQUJMRUQpOyAvLyByZW1vdmUgLmZwLXJlc3BvbnNpdmUgY2xhc3MgJiAuZnAtc2Nyb2xsYWJsZVxuXG4gICAgICByZW1vdmVDbGFzcygkYm9keSwgUkVTUE9OU0lWRSArICcgJyArIFNDUk9MTEFCTEUpOyAvLyByZW1vdmUgYWxsIG9mIHRoZSAuZnAtdmlld2luZy0gY2xhc3Nlc1xuXG4gICAgICAkYm9keS5jbGFzc05hbWUuc3BsaXQoL1xccysvKS5mb3JFYWNoKGZ1bmN0aW9uIChjbGFzc05hbWUpIHtcbiAgICAgICAgaWYgKGNsYXNzTmFtZS5pbmRleE9mKFZJRVdJTkdfUFJFRklYKSA9PT0gMCkge1xuICAgICAgICAgIHJlbW92ZUNsYXNzKCRib2R5LCBjbGFzc05hbWUpO1xuICAgICAgICB9XG4gICAgICB9KTsgLy9yZW1vdmluZyBhZGRlZCBjbGFzc2VzXG5cbiAgICAgIGdldE5vZGVzKGdldFN0YXRlKCkucGFuZWxzKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGlmIChnZXRPcHRpb25zKCkuc2Nyb2xsT3ZlcmZsb3cpIHtcbiAgICAgICAgICBzY3JvbGxPdmVyZmxvd0hhbmRsZXIuZGVzdHJveVdyYXBwZXIoaXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICByZW1vdmVDbGFzcyhpdGVtLCBUQUJMRSArICcgJyArIEFDVElWRSArICcgJyArIENPTVBMRVRFTFkgKyAnICcgKyBJU19PVkVSRkxPVyk7XG4gICAgICAgIHZhciBwcmV2aW91c1N0eWxlcyA9IGdldEF0dHIoaXRlbSwgJ2RhdGEtZnAtc3R5bGVzJyk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzU3R5bGVzKSB7XG4gICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgcHJldmlvdXNTdHlsZXMpO1xuICAgICAgICB9IC8vcmVtb3ZpbmcgYW5jaG9ycyBpZiB0aGV5IHdlcmUgbm90IHNldCB1c2luZyB0aGUgSFRNTCBtYXJrdXBcblxuXG4gICAgICAgIGlmIChoYXNDbGFzcyhpdGVtLCBTRUNUSU9OKSAmJiAhZ2V0SW5pdGlhbEFuY2hvcnNJbkRvbSgpKSB7XG4gICAgICAgICAgaXRlbS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYW5jaG9yJyk7XG4gICAgICAgIH1cbiAgICAgIH0pOyAvL3JlbW92aW5nIHRoZSBhcHBsaWVkIHRyYW5zaXRpb24gZnJvbSB0aGUgZnVsbHBhZ2Ugd3JhcHBlclxuXG4gICAgICByZW1vdmVBbmltYXRpb24oZ2V0Q29udGFpbmVyKCkpOyAvL1Vud3JhcHBpbmcgY29udGVudFxuXG4gICAgICBbVEFCTEVfQ0VMTF9TRUwsIFNMSURFU19DT05UQUlORVJfU0VMLCBTTElERVNfV1JBUFBFUl9TRUxdLmZvckVhY2goZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICAgICQoc2VsZWN0b3IsIGdldENvbnRhaW5lcigpKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgLy91bndyYXAgbm90IGJlaW5nIHVzZSBpbiBjYXNlIHRoZXJlJ3Mgbm8gY2hpbGQgZWxlbWVudCBpbnNpZGUgYW5kIGl0cyBqdXN0IHRleHRcbiAgICAgICAgICB1bndyYXAoaXRlbSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7IC8vcmVtb3ZpbmcgdGhlIGFwcGxpZWQgdHJhbnNpdGlvbiBmcm9tIHRoZSBmdWxscGFnZSB3cmFwcGVyXG5cbiAgICAgIGNzcyhnZXRDb250YWluZXIoKSwge1xuICAgICAgICAnLXdlYmtpdC10cmFuc2l0aW9uJzogJ25vbmUnLFxuICAgICAgICAndHJhbnNpdGlvbic6ICdub25lJ1xuICAgICAgfSk7XG4gICAgICByZW1vdmVDbGFzcyhnZXRDb250YWluZXIoKSwgV1JBUFBFUik7IC8vc2Nyb2xsaW5nIHRoZSBwYWdlIHRvIHRoZSB0b3Agd2l0aCBubyBhbmltYXRpb25cblxuICAgICAgd2luLnNjcm9sbFRvKDAsIDApOyAvL3JlbW92aW5nIHNlbGVjdG9yc1xuXG4gICAgICB2YXIgdXNlZFNlbGVjdG9ycyA9IFtTRUNUSU9OLCBTTElERSwgU0xJREVTX0NPTlRBSU5FUl07XG4gICAgICB1c2VkU2VsZWN0b3JzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoJCgnLicgKyBpdGVtKSwgaXRlbSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBGUC5kZXN0cm95ID0gZGVzdHJveTtcbiAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdXBkYXRlU3RydWN0dXJhbFN0YXRlKCk7XG4gICAgICB1cGRhdGVTdGF0ZSgpO1xuICAgICAgZ2V0T3B0aW9ucygpLnNjcm9sbEJhciA9IGdldE9wdGlvbnMoKS5zY3JvbGxCYXIgfHwgZ2V0T3B0aW9ucygpLmh5YnJpZDtcbiAgICAgIHNldE9wdGlvbnNGcm9tRE9NKCk7XG4gICAgICBwcmVwYXJlRG9tKCk7XG4gICAgICBzZXRBbGxvd1Njcm9sbGluZyh0cnVlKTtcbiAgICAgIHNldE1vdXNlSGlqYWNrKHRydWUpO1xuICAgICAgc2V0QXV0b1Njcm9sbGluZyhnZXRPcHRpb25zKCkuYXV0b1Njcm9sbGluZywgJ2ludGVybmFsJyk7XG4gICAgICByZXNwb25zaXZlKCk7IC8vc2V0dGluZyB0aGUgY2xhc3MgZm9yIHRoZSBib2R5IGVsZW1lbnRcblxuICAgICAgc2V0Qm9keUNsYXNzKCk7XG5cbiAgICAgIGlmIChkb2MucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICBzY3JvbGxUb0FuY2hvcigpO1xuICAgICAgfVxuXG4gICAgICB3aW5kb3dBZGRFdmVudCgnbG9hZCcsIHNjcm9sbFRvQW5jaG9yKTtcbiAgICAgIGFmdGVyUmVuZGVyQWN0aW9ucygpOyAvLyBVcGRhdGluZyB0aGUgc3RhdGUgYWdhaW4gd2l0aCB0aGUgbmV3IERPTVxuXG4gICAgICB1cGRhdGVTdHJ1Y3R1cmFsU3RhdGUoKTtcbiAgICAgIHVwZGF0ZVN0YXRlKCk7XG4gICAgfVxuICAgIC8qXG4gICAgKiBEZXN0cm95cyBmdWxscGFnZS5qcyBwbHVnaW4gZXZlbnRzIGFuZCBvcHRpbmFsbHkgaXRzIGh0bWwgbWFya3VwIGFuZCBzdHlsZXNcbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gZGVzdHJveShhbGwpIHtcbiAgICAgIHNldEF1dG9TY3JvbGxpbmcoZmFsc2UsICdpbnRlcm5hbCcpO1xuICAgICAgc2V0QWxsb3dTY3JvbGxpbmcodHJ1ZSk7XG4gICAgICBzZXRNb3VzZUhpamFjayhmYWxzZSk7XG4gICAgICBzZXRLZXlib2FyZFNjcm9sbGluZyhmYWxzZSk7XG4gICAgICBhZGRDbGFzcyhnZXRDb250YWluZXIoKSwgREVTVFJPWUVEKTtcbiAgICAgIEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50cy5vbkRlc3Ryb3kpOyAvL2xldHMgbWFrZSBhIG1lc3MhXG5cbiAgICAgIGlmIChhbGwpIHtcbiAgICAgICAgZGVzdHJveVN0cnVjdHVyZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBpc09LID0gZnVuY3Rpb24gaXNPSygpIHtcbiAgICAgIHJldHVybiBnZXRPcHRpb25zKCkgJiYgc3RhdGUuaXNWYWxpZCB8fCBkb2MuZG9tYWluLmluZGV4T2YoJ2FsJyArICd2YXJvdHJpJyArICdnbycgKyAnLicgKyAnY29tJykgPiAtMTtcbiAgICB9O1xuICAgIC8qKlxuICAgICogRGlzcGxheXMgd2FybmluZ3NcbiAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBkaXNwbGF5V2FybmluZ3MoKSB7XG4gICAgICB2YXIgbCA9IGdldE9wdGlvbnMoKVsnbGknICsgJ2MnICsgJ2Vuc2VLJyArICdlJyArICd5J107XG4gICAgICB2YXIgbXNnU3R5bGUgPSAnZm9udC1zaXplOiAxNXB4O2JhY2tncm91bmQ6eWVsbG93Oyc7XG5cbiAgICAgIGlmIChnZXRPcHRpb25zKCkubGljZW5zZUtleS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIHNob3dFcnJvcignZXJyb3InLCAnRnVsbHBhZ2UuanMgcmVxdWlyZXMgYSBgbGljZW5zZUtleWAgb3B0aW9uLiBSZWFkIGFib3V0IGl0IG9uIHRoZSBmb2xsb3dpbmcgVVJMOicpO1xuICAgICAgICBzaG93RXJyb3IoJ2Vycm9yJywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9hbHZhcm90cmlnby9mdWxsUGFnZS5qcyNvcHRpb25zJyk7XG4gICAgICB9IGVsc2UgaWYgKCFpc09LKCkpIHtcbiAgICAgICAgc2hvd0Vycm9yKCdlcnJvcicsICdJbmNvcnJlY3QgYGxpY2Vuc2VLZXlgLiBHZXQgb25lIGZvciBmdWxsUGFnZS5qcyB2ZXJzaW9uIDQgaGVyZTonKTtcbiAgICAgICAgc2hvd0Vycm9yKCdlcnJvcicsICdodHRwczovL2FsdmFyb3RyaWdvLmNvbS9mdWxsUGFnZS9wcmljaW5nJyk7XG4gICAgICB9IGVsc2UgaWYgKGwgJiYgbC5sZW5ndGggPCAyMCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJyVjIFRoaXMgd2Vic2l0ZSB3YXMgbWFkZSB1c2luZyBmdWxsUGFnZS5qcyBzbGlkZXIuIE1vcmUgaW5mbyBvbiB0aGUgZm9sbG93aW5nIHdlYnNpdGU6JywgbXNnU3R5bGUpO1xuICAgICAgICBjb25zb2xlLndhcm4oJyVjIGh0dHBzOi8vYWx2YXJvdHJpZ28uY29tL2Z1bGxQYWdlLycsIG1zZ1N0eWxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0NsYXNzKCRodG1sLCBFTkFCTEVEKSkge1xuICAgICAgICBzaG93RXJyb3IoJ2Vycm9yJywgJ0Z1bGxwYWdlLmpzIGNhbiBvbmx5IGJlIGluaXRpYWxpemVkIG9uY2UgYW5kIHlvdSBhcmUgZG9pbmcgaXQgbXVsdGlwbGUgdGltZXMhJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gRGlzYWJsZSBtdXR1YWxseSBleGNsdXNpdmUgc2V0dGluZ3NcblxuXG4gICAgICBpZiAoZ2V0T3B0aW9ucygpLmNvbnRpbnVvdXNWZXJ0aWNhbCAmJiAoZ2V0T3B0aW9ucygpLmxvb3BUb3AgfHwgZ2V0T3B0aW9ucygpLmxvb3BCb3R0b20pKSB7XG4gICAgICAgIGdldE9wdGlvbnMoKS5jb250aW51b3VzVmVydGljYWwgPSBmYWxzZTtcbiAgICAgICAgc2hvd0Vycm9yKCd3YXJuJywgJ09wdGlvbiBgbG9vcFRvcC9sb29wQm90dG9tYCBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgY29udGludW91c1ZlcnRpY2FsYDsgYGNvbnRpbnVvdXNWZXJ0aWNhbGAgZGlzYWJsZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldE9wdGlvbnMoKS5zY3JvbGxPdmVyZmxvdyAmJiAoZ2V0T3B0aW9ucygpLnNjcm9sbEJhciB8fCAhZ2V0T3B0aW9ucygpLmF1dG9TY3JvbGxpbmcpKSB7XG4gICAgICAgIHNob3dFcnJvcignd2FybicsICdPcHRpb25zIHNjcm9sbEJhcjp0cnVlIGFuZCBhdXRvU2Nyb2xsaW5nOmZhbHNlIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBzY3JvbGxPdmVyZmxvdzp0cnVlLiBTZWN0aW9ucyB3aXRoIHNjcm9sbE92ZXJmbG93IG1pZ2h0IG5vdCB3b3JrIHdlbGwgaW4gRmlyZWZveCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0T3B0aW9ucygpLmNvbnRpbnVvdXNWZXJ0aWNhbCAmJiAoZ2V0T3B0aW9ucygpLnNjcm9sbEJhciB8fCAhZ2V0T3B0aW9ucygpLmF1dG9TY3JvbGxpbmcpKSB7XG4gICAgICAgIGdldE9wdGlvbnMoKS5jb250aW51b3VzVmVydGljYWwgPSBmYWxzZTtcbiAgICAgICAgc2hvd0Vycm9yKCd3YXJuJywgJ1Njcm9sbCBiYXJzIChgc2Nyb2xsQmFyOnRydWVgIG9yIGBhdXRvU2Nyb2xsaW5nOmZhbHNlYCkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBjb250aW51b3VzVmVydGljYWxgOyBgY29udGludW91c1ZlcnRpY2FsYCBkaXNhYmxlZCcpO1xuICAgICAgfSAvL3VzaW5nIGV4dGVuc2lvbnM/IFdyb25nIGZpbGUhXG5cblxuICAgICAgZXh0ZW5zaW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChleHRlbnNpb24pIHtcbiAgICAgICAgLy9pcyB0aGUgb3B0aW9uIHNldCB0byB0cnVlP1xuICAgICAgICBpZiAoZ2V0T3B0aW9ucygpW2V4dGVuc2lvbl0pIHtcbiAgICAgICAgICBzaG93RXJyb3IoJ3dhcm4nLCAnZnVsbHBhZ2UuanMgZXh0ZW5zaW9ucyByZXF1aXJlIGZ1bGxwYWdlLmV4dGVuc2lvbnMubWluLmpzIGZpbGUgaW5zdGVhZCBvZiB0aGUgdXN1YWwgZnVsbHBhZ2UuanMuIFJlcXVlc3RlZDogJyArIGV4dGVuc2lvbik7XG4gICAgICAgIH1cbiAgICAgIH0pOyAvL2FuY2hvcnMgY2FuIG5vdCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGFueSBlbGVtZW50IElEIG9yIE5BTUVcblxuICAgICAgZ2V0T3B0aW9ucygpLmFuY2hvcnMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAvL2Nhc2UgaW5zZW5zaXRpdmUgc2VsZWN0b3JzIChodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xOTQ2NTE4Ny8xMDgxMzk2KVxuICAgICAgICB2YXIgbmFtZUF0dHIgPSBbXS5zbGljZS5jYWxsKCQoJ1tuYW1lXScpKS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gZ2V0QXR0cihpdGVtLCAnbmFtZScpICYmIGdldEF0dHIoaXRlbSwgJ25hbWUnKS50b0xvd2VyQ2FzZSgpID09IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBpZEF0dHIgPSBbXS5zbGljZS5jYWxsKCQoJ1tpZF0nKSkuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGdldEF0dHIoaXRlbSwgJ2lkJykgJiYgZ2V0QXR0cihpdGVtLCAnaWQnKS50b0xvd2VyQ2FzZSgpID09IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGlkQXR0ci5sZW5ndGggfHwgbmFtZUF0dHIubGVuZ3RoKSB7XG4gICAgICAgICAgc2hvd0Vycm9yKCdlcnJvcicsICdkYXRhLWFuY2hvciB0YWdzIGNhbiBub3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBhbnkgYGlkYCBlbGVtZW50IG9uIHRoZSBzaXRlIChvciBgbmFtZWAgZWxlbWVudCBmb3IgSUUpLicpO1xuICAgICAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBpZEF0dHIubGVuZ3RoID8gJ2lkJyA6ICduYW1lJztcblxuICAgICAgICAgIGlmIChpZEF0dHIubGVuZ3RoIHx8IG5hbWVBdHRyLmxlbmd0aCkge1xuICAgICAgICAgICAgc2hvd0Vycm9yKCdlcnJvcicsICdcIicgKyBuYW1lICsgJ1wiIGlzIGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciBlbGVtZW50IGAnICsgcHJvcGVydHlOYW1lICsgJ2AgcHJvcGVydHknKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZ1bGxwYWdlKGNvbnRhaW5lclNlbGVjdG9yLCBvcHRpb25zKSB7XG4gICAgICBzZXRDYWNoZSgpOyAvL29ubHkgb25jZSBteSBmcmllbmQhXG5cbiAgICAgIGlmIChoYXNDbGFzcygkaHRtbCwgRU5BQkxFRCkpIHtcbiAgICAgICAgZGlzcGxheVdhcm5pbmdzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0T3B0aW9uKCd0b3VjaFdyYXBwZXInLCB0eXBlb2YgY29udGFpbmVyU2VsZWN0b3IgPT09ICdzdHJpbmcnID8gJChjb250YWluZXJTZWxlY3RvcilbMF0gOiBjb250YWluZXJTZWxlY3Rvcik7IC8vIENyZWF0aW5nIHNvbWUgZGVmYXVsdHMsIGV4dGVuZGluZyB0aGVtIHdpdGggYW55IG9wdGlvbnMgdGhhdCB3ZXJlIHByb3ZpZGVkXG5cbiAgICAgIHNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICBzZXRDb250YWluZXIodHlwZW9mIGNvbnRhaW5lclNlbGVjdG9yID09PSAnc3RyaW5nJyA/ICQoY29udGFpbmVyU2VsZWN0b3IpWzBdIDogY29udGFpbmVyU2VsZWN0b3IpO1xuICAgICAgRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRzLm9uSW5pdGlhbGlzZSk7XG4gICAgICBkaXNwbGF5V2FybmluZ3MoKTtcbiAgICAgIHNldEFQSSgpO1xuXG4gICAgICBpZiAoZ2V0Q29udGFpbmVyKCkpIHtcbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnRzLmJlZm9yZUluaXQpO1xuICAgICAgICBpbml0KCk7XG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0KGV2ZW50cy5iaW5kRXZlbnRzKTtcbiAgICAgIH0gLy8gQHRzLWlnbm9yZVxuXG5cbiAgICAgIHJldHVybiB3aW4uZnVsbHBhZ2VfYXBpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldEFQSSgpIHtcbiAgICAgIEZQLmdldEZ1bGxwYWdlRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvcHRpb25zOiBnZXRPcHRpb25zKClcbiAgICAgICAgfTtcbiAgICAgIH07IC8vcHVibGljIGZ1bmN0aW9uc1xuXG5cbiAgICAgIEZQLnZlcnNpb24gPSAnNC4wLjIwJztcbiAgICAgIEZQLnRlc3QgPSBPYmplY3QuYXNzaWduKEZQLnRlc3QsIHtcbiAgICAgICAgdG9wOiAnMHB4JyxcbiAgICAgICAgdHJhbnNsYXRlM2Q6ICd0cmFuc2xhdGUzZCgwcHgsIDBweCwgMHB4KScsXG4gICAgICAgIHRyYW5zbGF0ZTNkSDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBhID0gW107XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICQoZ2V0T3B0aW9ucygpLnNlY3Rpb25TZWxlY3RvciwgZ2V0Q29udGFpbmVyKCkpLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhLnB1c2goJ3RyYW5zbGF0ZTNkKDBweCwgMHB4LCAwcHgpJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH0oKSxcbiAgICAgICAgbGVmdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBhID0gW107XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICQoZ2V0T3B0aW9ucygpLnNlY3Rpb25TZWxlY3RvciwgZ2V0Q29udGFpbmVyKCkpLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhLnB1c2goMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH0oKSxcbiAgICAgICAgb3B0aW9uczogZ2V0T3B0aW9ucygpLFxuICAgICAgICBzZXRBdXRvU2Nyb2xsaW5nOiBudWxsXG4gICAgICB9KTsgLy9mdW5jdGlvbnMgd2Ugd2FudCB0byBzaGFyZSBhY3Jvc3MgZmlsZXMgYnV0IHdoaWNoIGFyZSBub3RcbiAgICAgIC8vbWVhbiB0byBiZSB1c2VkIG9uIHRoZWlyIG93biBieSBkZXZlbG9wZXJzXG5cbiAgICAgIEZQLnNoYXJlZCA9IE9iamVjdC5hc3NpZ24oRlAuc2hhcmVkLCB7XG4gICAgICAgIGFmdGVyUmVuZGVyQWN0aW9uczogbnVsbCxcbiAgICAgICAgaXNOb3JtYWxTY3JvbGxFbGVtZW50OiBmYWxzZVxuICAgICAgfSk7IC8vIEB0cy1pZ25vcmVcblxuICAgICAgd2luLmZ1bGxwYWdlX2FwaSA9IEZQO1xuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcblxuICAgIHdpbi5mcF9lYXNpbmdzID0gZGVlcEV4dGVuZCh3aW4uZnBfZWFzaW5ncywge1xuICAgICAgZWFzZUluT3V0Q3ViaWM6IGZ1bmN0aW9uIGVhc2VJbk91dEN1YmljKHQsIGIsIGMsIGQpIHtcbiAgICAgICAgaWYgKCh0IC89IGQgLyAyKSA8IDEpIHJldHVybiBjIC8gMiAqIHQgKiB0ICogdCArIGI7XG4gICAgICAgIHJldHVybiBjIC8gMiAqICgodCAtPSAyKSAqIHQgKiB0ICsgMikgKyBiO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogalF1ZXJ5IGFkYXB0ZXIgZm9yIGZ1bGxQYWdlLmpzIDMuMC4wXG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuXG4gICAgaWYgKHdpbi5qUXVlcnkpIHtcbiAgICAgIChmdW5jdGlvbiAoJCwgZnVsbHBhZ2UpIHtcblxuICAgICAgICBpZiAoISQgfHwgIWZ1bGxwYWdlKSB7XG4gICAgICAgICAgc2hvd0Vycm9yKCdlcnJvcicsICdqUXVlcnkgaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBqUXVlcnkgZnVsbHBhZ2UgYWRhcHRlciEnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAkLmZuLmZ1bGxwYWdlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICAgICAgICAgICckJzogJFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG5ldyBmdWxscGFnZSh0aGlzWzBdLCBvcHRpb25zKTsgLy8gQ3JlYXRpbmcgdGhlICQuZm4uZnVsbHBhZ2Ugb2JqZWN0XG5cbiAgICAgICAgICBPYmplY3Qua2V5cyhGUCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBnZXRPcHRpb25zKCkuJC5mbi5mdWxscGFnZVtrZXldID0gRlBba2V5XTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgICB9KSh3aW4ualF1ZXJ5LCBmdWxscGFnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bGxwYWdlO1xuXG59KSk7XG4iLCIvLyBPcHRpb25hbC4gV2hlbiB1c2luZyBmdWxsUGFnZSBleHRlbnNpb25zXG4vL2ltcG9ydCBzY3JvbGxIb3Jpem9udGFsbHkgZnJvbSAnLi9mdWxscGFnZS5zY3JvbGxIb3Jpem9udGFsbHkubWluJztcblxuLy8gT3B0aW9uYWwuIFdoZW4gdXNpbmcgc2Nyb2xsT3ZlcmZsb3c6dHJ1ZVxuLy9pbXBvcnQgSVNjcm9sbCBmcm9tICdmdWxscGFnZS5qcy92ZW5kb3JzL3Njcm9sbG92ZXJmbG93JztcblxuLy8gSW1wb3J0aW5nIGZ1bGxwYWdlLmpzXG5pbXBvcnQgZnVsbHBhZ2UgZnJvbSAnZnVsbHBhZ2UuanMnO1xuXG4vLyBXaGVuIHVzaW5nIGZ1bGxQYWdlIGV4dGVuc2lvbnMgcmVwbGFjZSB0aGUgcHJldmlvdXMgaW1wb3J0XG4vLyBvZiBmdWxscGFnZS5qcyBmb3IgdGhpcyBmaWxlXG4vL2ltcG9ydCBmdWxscGFnZSBmcm9tICdmdWxscGFnZS5qcy9kaXN0L2Z1bGxwYWdlLmV4dGVuc2lvbnMubWluJztcblxuLy8gSW5pdGlhbGl6aW5nIGl0XG52YXIgZnVsbFBhZ2VJbnN0YW5jZSA9IG5ldyBmdWxscGFnZSgnI215RnVsbHBhZ2UnLCB7XG4gICAgbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICBzZWN0aW9uc0NvbG9yOlsnI2ZmNWY0NScsICcjMDc5OGVjJywgJyNmYzZjN2MnLCAnZ3JleSddXG59KTtcblxuLy8gQ2FsbGluZyBtZXRob2RzXG4vLyBmdWxscGFnZV9hcGkubW92ZVNlY3Rpb25Eb3duKCk7XG4vLyBPclxuLy8gZnVsbFBhZ2VJbnN0YW5jZS5tb3ZlU2VjdGlvbkRvd24oKTsiXSwic291cmNlUm9vdCI6IiJ9"
  },
  {
    "path": "examples/module_loaders/webpack-example/package.json",
    "content": "{\n  \"name\": \"webpack-example\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"build\": \"export SET NODE_OPTIONS=--openssl-legacy-provider && npx webpack --mode development --config webpack.config.js\"\n  },\n  \"keywords\": [],\n  \"author\": \"\",\n  \"private\": true,\n  \"license\": \"GPLv3\",\n  \"devDependencies\": {\n    \"webpack\": \"^4.19.1\",\n    \"webpack-cli\": \"^3.1.1\"\n  },\n  \"dependencies\": {\n    \"fullpage.js\": \"^4.0.21\"\n  }\n}\n"
  },
  {
    "path": "examples/module_loaders/webpack-example/src/index.js",
    "content": "// Optional. When using fullPage extensions\n//import scrollHorizontally from './fullpage.scrollHorizontally.min';\n\n// Optional. When using scrollOverflow:true\n//import IScroll from 'fullpage.js/vendors/scrolloverflow';\n\n// Importing fullpage.js\nimport fullpage from 'fullpage.js';\n\n// When using fullPage extensions replace the previous import\n// of fullpage.js for this file\n//import fullpage from 'fullpage.js/dist/fullpage.extensions.min';\n\n// Initializing it\nvar fullPageInstance = new fullpage('#myFullpage', {\n    navigation: true,\n    sectionsColor:['#ff5f45', '#0798ec', '#fc6c7c', 'grey']\n});\n\n// Calling methods\n// fullpage_api.moveSectionDown();\n// Or\n// fullPageInstance.moveSectionDown();"
  },
  {
    "path": "examples/module_loaders/webpack-example/webpack.config.js",
    "content": "var webpack = require('webpack');\nconst path = require('path');\n\nvar PROD = JSON.parse(process.env.PROD_ENV || '0');\n\nmodule.exports = {\n  entry: './src/index.js',\n  output: {\n    filename: 'main.js',\n    path: path.resolve(__dirname, 'dist')\n  },\n  devtool: 'inline-source-map'\n};"
  },
  {
    "path": "examples/navigation-horizontal.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Horizontal navigation dots - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage full-screen sliders navigation widh dots.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,sliders navigation, horizontal navigation,horizontal,navigation,dots\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n    <style>\r\n\r\n    /* Style for our header texts\r\n    * --------------------------------------- */\r\n    h1{\r\n        font-size: 5em;\r\n        font-family: arial,helvetica;\r\n        color: #fff;\r\n        margin:0;\r\n    }\r\n    .intro p{\r\n        color: #fff;\r\n    }\r\n\r\n    /* Centered texts in each section\r\n    * --------------------------------------- */\r\n    .section{\r\n        text-align:center;\r\n    }\r\n\r\n\r\n    /* Overwriting styles for the navigation dots (to place it where we want)\r\n    * --------------------------------------- */\r\n    .fp-slidesNav.bottom{\r\n        bottom: 25px;\r\n    }\r\n\r\n    /* Bottom menu\r\n    * --------------------------------------- */\r\n    #infoMenu li a {\r\n        color: #fff;\r\n    }\r\n\r\n    #section2 h1{\r\n        color: #333;\r\n    }\r\n\r\n    </style>\r\n\r\n    <!--[if IE]>\r\n        <script type=\"text/javascript\">\r\n             var console = { log: function() {} };\r\n        </script>\r\n    <![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n<div id=\"fullpage\">\r\n\r\n    <div class=\"section \" id=\"section0\">\r\n        <div class=\"intro\">\r\n            <img src=\"imgs/1.png\"  alt=\"1\"/>\r\n            <h1>Sliders navigation dots</h1>\r\n            <p>Create a navigation for your landscape sliders</p>\r\n        </div>\r\n    </div>\r\n    <div class=\"section\" id=\"section1\">\r\n        <div class=\"slide\" id=\"slide1\" data-anchor=\"slide1\">\r\n            <div class=\"intro\">\r\n                <h1>Clickable</h1>\r\n                <p>\r\n                    You can even click on the navigation and jump directly to another section.\r\n                </p>\r\n            </div>\r\n        </div>\r\n\r\n        <div class=\"slide\" id=\"slide2\" data-anchor=\"slide2\">\r\n            <h1>Slide 2</h1>\r\n        </div>\r\n\r\n        <div class=\"slide\" id=\"slide3\" data-anchor=\"slide3\">\r\n            <h1>Slide 3</h1>\r\n        </div>\t<div class=\"slide\" id=\"slide3\" data-anchor=\"slide3\">\r\n            <h1>Slide 4</h1>\r\n        </div>\r\n        <div class=\"slide\" id=\"slide3\" data-anchor=\"slide3\">\r\n            <h1>Slide 5</h1>\r\n        </div>\r\n    </div>\r\n    <div class=\"section\" id=\"section2\">\r\n        <div class=\"intro\">\r\n            <h1>Enjoy it</h1>\r\n        </div>\r\n    </div>\r\n</div>\r\n\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        anchors: ['firstPage', 'secondPage', '3rdPage'],\r\n        sectionsColor: ['#8FB98B', '#DE564B', '#EAE1C0'],\r\n        slidesNavigation: true,\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/navigation-tooltips.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>Navigation tooltips - fullPage.js</title>\n    <meta name=\"author\" content=\"Matthew Howell\" />\n    <meta name=\"description\" content=\"fullPage continuous scrolling demo.\" />\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,scroll,loop,continuous\" />\n    <meta name=\"Resource-type\" content=\"Document\" />\n\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\n\n    <style>\n\n    /* Overwriting styles for navigation bullets\n\t* --------------------------------------- */\n\t#fp-nav ul li a span, \n\t.fp-slidesNav ul li a span{\n\t\tbackground: white;\n\t}\n    \n    </style>\n\n    <!--[if IE]>\n        <script type=\"text/javascript\">\n             var console = { log: function() {} };\n        </script>\n    <![endif]-->\n</head>\n<body>\n\n<ul id=\"menu\">\n    <li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">First slide</a></li>\n    <li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second slide</a></li>\n    <li data-menuanchor=\"3rdPage\"><a href=\"#3rdPage\">Third slide</a></li>\n</ul>\n\n\n<select id=\"demosMenu\">\n    <option selected>Choose Demo</option>\n    <option id=\"simple\">Simple</option>\n    <option id=\"custom-arrows\">Custom arrows</option>\n    <option id=\"hide-sections\">Hide sections</option>\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\n    <option id=\"observer\">Observer</option>\n    <option id=\"jquery-adapter\">jQuery adapter</option>\n    <option id=\"active-slide\">Active section and slide</option>\n    <option id=\"auto-height\">Auto height</option>\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\n    <option id=\"backgrounds\">Background images</option>\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\n    <option id=\"background-video\">Background video</option>\n    <option id=\"callbacks\">Callbacks</option>\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\n    <option id=\"continuous-vertical\">Continuous vertical</option>\n    <option id=\"parallax\">Parallax (premium)</option>\n    <option id=\"cards\">Cards 3d (premium)</option>\n    <option id=\"water-effect\">Water effect (premium)</option>\n    <option id=\"drop-effect\">Drop effect (premium)</option>\n    <option id=\"css3\">CSS3</option>\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\n    <option id=\"easing-css3\">Easing CSS</option>\n    <option id=\"easing-js\">Easing JS</option>\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\n    <option id=\"fixed-headers\">Fixed headers</option>\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\n    <option id=\"looping\">Looping</option>\n    <option id=\"methods\">Methods</option>\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\n    <option id=\"no-anchor\">No anchor links</option>\n    <option id=\"normal-scroll\">Normal scrolling</option>\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\n    <option id=\"offset-sections\">Offset sections (premium)</option>\n    <option id=\"one-section\">One single section</option>\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\n    <option id=\"responsive-height\">Responsive Height</option>\n    <option id=\"responsive-width\">Responsive Width</option>\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\n    <option id=\"scrollBar\">Scroll bar enabled</option>\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\n    <option id=\"lazy-load\">Lazy load</option>\n    <option id=\"scrolling-speed\">Scrolling speed</option>\n    <option id=\"rtl\">RTL</option>\n    <option id=\"trigger-animations\">Trigger animations</option>\n    <option id=\"vue-fullpage\">Vue component</option>\n    <option id=\"react-fullpage\">React component</option>\n    <option id=\"angular-fullpage\">Angular component</option>\n  </select>\n\n<div id=\"fullpage\">\n    <div class=\"section\" id=\"section0\">\n        <div class=\"intro\">\n          <h1>Section 1</h1>\n          <p>\n            Use the `navigationTooltips` option to use a text for each of the bullets in the navigation element.\n          </p>\n        </div>\n    </div>\n    <div class=\"section\" id=\"section1\">\n        <h1>Section 2</h1>\n    </div>\n    <div class=\"section\" id=\"section2\">\n        <h1>Section 3</h1>\n    </div>\n</div>\n\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\n<script type=\"text/javascript\" src=\"examples.js\"></script>\n<script type=\"text/javascript\">\n    var myFullpage = new fullpage('#fullpage', {\n        sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE', 'whitesmoke', '#ccddff'],\n        anchors: ['firstPage', 'secondPage', '3rdPage'],\n        navigation:true,\n        navigationTooltips: ['Page 1', 'Page 2', 'Any text!'],\n        showActiveTooltip: true,\n        menu: '#menu'\n    });\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "examples/navigation-vertical.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>Vertical navigation dots - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage full-screen navigation and sections control menu.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,navigation,control arrows, dots\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\t<style>\r\n\r\n\t/* Style for our header texts\r\n\t* --------------------------------------- */\r\n\th1{\r\n\t\tfont-size: 5em;\r\n\t\tfont-family: arial,helvetica;\r\n\t\tcolor: #fff;\r\n\t\tmargin:0;\r\n\t}\r\n\t.intro p{\r\n\t\tcolor: #fff;\r\n\t}\r\n\r\n\t/* Centered texts in each section\r\n\t* --------------------------------------- */\r\n\t.section{\r\n\t\ttext-align:center;\r\n\t}\r\n\r\n\t/* Overwriting styles for control arrows for slides\r\n\t* --------------------------------------- */\r\n\t.controlArrow.prev {\r\n\t\tleft: 50px;\r\n\t}\r\n\t.controlArrow.next{\r\n\t\tright: 50px;\r\n\t}\r\n\r\n\t/* Overwriting styles for navigation bullets\r\n\t* --------------------------------------- */\r\n\t#fp-nav ul li a span, \r\n\t.fp-slidesNav ul li a span{\r\n\t\tbackground: white;\r\n\t}\r\n\r\n\r\n\t/* Bottom menu\r\n\t* --------------------------------------- */\r\n\t#infoMenu li a {\r\n\t\tcolor: #fff;\r\n\t}\r\n\t</style>\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section \" id=\"section0\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Navigation dots</h1>\r\n\t\t\t<p>An easy and beautiful way to navigate through the sections</p>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t    <div class=\"slide\" id=\"slide1\">\r\n\t\t\t<div class=\"intro\">\r\n\t\t\t\t<h1>Clickable</h1>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tYou can even click on the navigation and jump directly to another section.\r\n\t\t\t\t</p>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t    <div class=\"slide\" id=\"slide2\">\r\n\t\t\t<h1>Slide 2</h1>\r\n\t\t</div>\r\n\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Enjoy it</h1>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        anchors: ['firstPage', 'secondPage', '3rdPage'],\r\n        sectionsColor: ['#C63D0F', '#1BBC9B', '#7E8F7C'],\r\n        navigation: true,\r\n        navigationPosition: 'right',\r\n        navigationTooltips: ['First page', 'Second page', 'Third and last page']\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/no-anchor.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>No Anchor links - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage.js with no anchor links.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,anchor,links,inside,demo\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section \" id=\"section0\">\r\n\t\t<div class=\"intro\">\r\n\t\t  <h1>fullPage.js</h1>\r\n  \t\t<p>No Anchor Links (#)</p>\r\n    </div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>More Simple yet</h1>\r\n\t\t\t<p>Sections won't contain anchor links. It's more simple to configure but a bit more restrictive.</p>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>URL without /#</h1>\r\n\t\t\t<p>But back button won't work!</p>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE']\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "examples/normal-scroll.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Normal scrolling - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage full-screen normal scrolling with autoScrolling.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,normal scroll,autoscrolling, scroll\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n    <style>\r\n\r\n    /* Style for our header texts\r\n    * --------------------------------------- */\r\n    h1{\r\n        font-size: 5em;\r\n        font-family: arial,helvetica;\r\n        color: #fff;\r\n        margin:0;\r\n    }\r\n    .intro p{\r\n        color: #fff;\r\n    }\r\n\r\n    /* Centered texts in each section\r\n    * --------------------------------------- */\r\n    .section{\r\n        text-align:center;\r\n    }\r\n\r\n\r\n    /* Bottom menu\r\n    * --------------------------------------- */\r\n    #infoMenu li a {\r\n        color: #fff;\r\n    }\r\n    </style>\r\n\r\n    <!--[if IE]>\r\n        <script type=\"text/javascript\">\r\n             var console = { log: function() {} };\r\n        </script>\r\n    <![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n<ul id=\"menu\">\r\n    <li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">First slide</a></li>\r\n    <li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second slide</a></li>\r\n    <li data-menuanchor=\"3rdPage\"><a href=\"#3rdPage\">Third slide</a></li>\r\n</ul>\r\n\r\n<div id=\"fullpage\">\r\n    <div class=\"section \" id=\"section0\">\r\n        <div class=\"intro\">\r\n            <h1>Normal scrolling</h1>\r\n            <p>With a linked menu</p>\r\n        </div>\r\n    </div>\r\n    <div class=\"section\" id=\"section1\">\r\n        <div class=\"slide\" id=\"slide1\">\r\n            <div class=\"intro\">\r\n                <h1>URL gets updated (#)</h1>\r\n                <p>\r\n                    Easy to bookmark and share\r\n                </p>\r\n            </div>\r\n        </div>\r\n\r\n        <div class=\"slide\" id=\"slide2\">\r\n            <div>\r\n                <h1>Horizontal sliders!</h1>\r\n                <img src=\"imgs/iphone-blue.png\" alt=\"iphone\" id=\"iphone-two\" />\r\n            </div>\r\n        </div>\r\n\r\n    </div>\r\n    <div class=\"section\" id=\"section2\">\r\n        <div class=\"intro\">\r\n            <h1>Just use it like this:</h1>\r\n            <p>autoScrolling:false</p>\r\n        </div>\r\n    </div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        menu: '#menu',\r\n        anchors: ['firstPage', 'secondPage', '3rdPage'],\r\n        sectionsColor: ['#C63D0F', '#1BBC9B', '#7E8F7C'],\r\n        autoScrolling: false,\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/normalScrollElements.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Normal Scroll Elements - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"Normal Scroll Elements for fullPage.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,normoalScrollElements,overflow,scrollable,scrollbar\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\r\n    <style>\r\n        .scrollable-element{\r\n            height: 400px;\r\n            width: 600px;\r\n            overflow-y: scroll;\r\n            margin: 0 auto;\r\n        }\r\n        .box{\r\n            display: block;\r\n            background: white;\r\n            margin: 20px;\r\n            padding: 20px;\r\n        }\r\n    </style>\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n<div id=\"fullpage\">\r\n    <div class=\"section active\" id=\"section0\">\r\n        <div>\r\n            <h1>fullPage.js</h1>\r\n            <p>Normal Scroll Elements</p>\r\n            <div class=\"scrollable-element\">\r\n                <div class=\"box\">Some text</div>\r\n                <div class=\"box\">Some text</div>\r\n                <div class=\"box\">Some text</div>\r\n                <div class=\"box\">Some text</div>\r\n                <div class=\"box\">Some text</div>\r\n                <div class=\"box\">Some text</div>\r\n                <div class=\"box\">Some text</div>\r\n                <div class=\"box\">Some text</div>\r\n                <div class=\"box\">Some text</div>\r\n                <div class=\"box\">Some text</div>\r\n                <div class=\"box\">Some text</div>\r\n                <div class=\"box\">Some text</div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n    <div class=\"section\" id=\"section1\">\r\n        <div class=\"slide\"><h1>Section 2</h1></div>\r\n        <div class=\"slide\"><h1>Slide 2.2</h1></div>\r\n        <div class=\"slide\"><h1>Slide 2.1</h1></div>\r\n    </div>\r\n    <div class=\"section\" id=\"section2\"><h1>Section 3</h1></div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        sectionsColor: ['#f2f2f2', '#4BBFC3', '#7BAABE', 'whitesmoke', '#ccddff'],\r\n        normalScrollElements: '.scrollable-element',\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/observer.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<title>Observer - fullPage.js</title>\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n\t<meta name=\"description\" content=\"fullPage.js using CSS3 transformations.\" />\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,anchor,links,inside,demo,css,css3\" />\n\t<meta name=\"Resource-type\" content=\"Document\" />\n\n\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\n    <style>\n        /* Hidding sections under 960px width */\n        @media screen and (max-width: 960px) {\n            .hide-on-responsive{\n                display: none;\n            }\n        }\n\n        #fp-nav ul li a span, \n        .fp-slidesNav ul li a span{\n            background-color: white;\n        }\n        \n\n        .actions{\n            position: absolute;\n            z-index: 999;\n            top: 40px;\n            left: 50px;\n        }\n        .actions li{\n            display: inline-block;\n        }\n        .actions button {\n            padding: 0.93em 1.87em;\n            background: #35495e;\n            border-radius: 5px;\n            border: 0;\n            color: #fff;\n            margin: 7px;\n            font-size: 15px;\n            cursor: pointer;\n        }\n\n        .actions button:hover {\n            background: #fff;\n            color: #35495e;\n        }\n    </style>\n</head>\n<body>\n\n<ul class=\"actions\">\n    <li><button data-type=\"section\">Add section</button></li>\n    <li><button data-type=\"slides\">Add 2 new slides</button></li>\n    <li><button data-type=\"remove\">Remove Current</button></li>\n</ul>\n\n\n<select id=\"demosMenu\">\n    <option selected>Choose Demo</option>\n    <option id=\"simple\">Simple</option>\n    <option id=\"custom-arrows\">Custom arrows</option>\n    <option id=\"hide-sections\">Hide sections</option>\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\n    <option id=\"observer\">Observer</option>\n    <option id=\"jquery-adapter\">jQuery adapter</option>\n    <option id=\"active-slide\">Active section and slide</option>\n    <option id=\"auto-height\">Auto height</option>\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\n    <option id=\"backgrounds\">Background images</option>\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\n    <option id=\"background-video\">Background video</option>\n    <option id=\"callbacks\">Callbacks</option>\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\n    <option id=\"continuous-vertical\">Continuous vertical</option>\n    <option id=\"parallax\">Parallax (premium)</option>\n    <option id=\"cards\">Cards 3d (premium)</option>\n    <option id=\"water-effect\">Water effect (premium)</option>\n    <option id=\"drop-effect\">Drop effect (premium)</option>\n    <option id=\"css3\">CSS3</option>\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\n    <option id=\"easing-css3\">Easing CSS</option>\n    <option id=\"easing-js\">Easing JS</option>\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\n    <option id=\"fixed-headers\">Fixed headers</option>\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\n    <option id=\"looping\">Looping</option>\n    <option id=\"methods\">Methods</option>\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\n    <option id=\"no-anchor\">No anchor links</option>\n    <option id=\"normal-scroll\">Normal scrolling</option>\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\n    <option id=\"offset-sections\">Offset sections (premium)</option>\n    <option id=\"one-section\">One single section</option>\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\n    <option id=\"responsive-height\">Responsive Height</option>\n    <option id=\"responsive-width\">Responsive Width</option>\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\n    <option id=\"scrollBar\">Scroll bar enabled</option>\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\n    <option id=\"lazy-load\">Lazy load</option>\n    <option id=\"scrolling-speed\">Scrolling speed</option>\n    <option id=\"rtl\">RTL</option>\n    <option id=\"trigger-animations\">Trigger animations</option>\n    <option id=\"vue-fullpage\">Vue component</option>\n    <option id=\"react-fullpage\">React component</option>\n    <option id=\"angular-fullpage\">Angular component</option>\n  </select>\n\n\n<div id=\"fullpage\">\n    <div class=\"section\">\n        <h1>fullPage.js 1</h1>\n\t\t    <p>\n                Hide, add or modify sections.<br>\n                fullPage.js will get updated automatically.\n            </p>\n    </div>\n\t<div class=\"section\" id=\"section0\">\n        <div class=\"slide\">\n            <h1>fullPage.js 2</h1>\n\t\t    <p>\n                Hide, add or modify sections.<br>\n                fullPage.js will get updated automatically.\n            </p>\n        </div>\n        <div class=\"slide\">\n            <h1>Cool uh?</h1>\n\t\t    <p>fullPage.js listen to your DOM!</p>\n        </div>\n\n\t\t\n\t</div>\n\t<div class=\"section hide-on-responsive\" id=\"section1\">\n\t\t<div class=\"intro\">\n\t\t\t<h1>To Hide On Responsive</h1>\n\t\t\t<p>\n                This section will get hidden when reaching 960px width.<br />\n                We are using CSS to hide the sections. <br />\n                But fullPage.js will notice the change and update accordingly.\n\t\t\t</p>\n\t\t</div>\n\t</div>\n\t<div class=\"section \" id=\"section2\">\n\t\t<div class=\"intro\">\n\t\t\t<h1>Check it out!</h1>\n\t\t\t<p>You'll love it</p>\n\t\t</div>\n\t</div>\n</div>\n\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\n<script type=\"text/javascript\" src=\"examples.js\"></script>\n<script type=\"text/javascript\">\n    var myFullpage = new fullpage('#fullpage', {\n        sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE', '#435b71', 'orange', 'blue', 'purple', 'yellow', '#435b71', 'orange', 'blue', 'purple', 'yellow' ],\n        anchors: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13'],\n        controlArrows: false,\n        navigation: true,\n        slidesNavigation: true\n    });\n\n\n    document.querySelectorAll('button').forEach(function(button){\n        button.addEventListener('click', onActionClick);\n    });\n\n    \n    function onActionClick(e){\n        var type = e.target.getAttribute('data-type');\n        let activeSection;\n\n        switch(type){\n            case 'section':\n                var anchorId = \"new-anchor-\" + document.querySelectorAll('.fp-section').length;\n                document.querySelector('#fullpage').innerHTML += '<div class=\"section\" data-anchor=\"'+ anchorId +'\"><h1>New section</h1></div>';\n\n                break;\n\n            case 'slides':\n                activeSection = document.querySelector('.fp-section.active');\n                const newSlides = '<div class=\"slide\"><h1>New slide 1.1</h1></div><div class=\"slide\"><h1>New slide 1.2</h1></div>';\n                if(activeSection.querySelector('.fp-slide')){\n                    activeSection.querySelector('.fp-slidesContainer').innerHTML += newSlides;\n                }\n                else{\n                    activeSection.innerHTML = newSlides;\n                }\n\n                break;\n\n            case 'remove':\n                activeSection = document.querySelector('.fp-section.active');\n                const numSlides = activeSection.querySelectorAll('.fp-slide').length;\n                const activeSlide = activeSection.querySelector('.fp-slide.active');\n                const toRemove = numSlides > 1 ? activeSlide : activeSection;\n\n                toRemove.parentNode.removeChild(toRemove);\n\n                break;\n        }\n    }\n\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "examples/offset-sections.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Offset Sections - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage auto-height example.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,auto-height,full-screen\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/fullPage/extensions/offsetSections.html\" />\r\n</head>\r\n<body>\r\n\r\nRedirecting...\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/one-section.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>One single section - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage One single section.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,One, Single, Section\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\t<style>\r\n\r\n\t/* Style for our header texts\r\n\t* --------------------------------------- */\r\n\th1{\r\n\t\tfont-size: 5em;\r\n\t\tfont-family: arial,helvetica;\r\n\t\tcolor: #fff;\r\n\t\tmargin:0;\r\n\t\tpadding:40px 0 0 0;\r\n\t}\r\n\t.intro p{\r\n\t\tcolor: #fff;\r\n\t\tpadding:40px 0 0 0;\r\n\t}\r\n\t.wrap{\r\n\t\tmargin-left: auto;\r\n\t\tmargin-right: auto;\r\n\t\twidth: 980px;\r\n\t\tposition: relative;\r\n\t\tpadding: 20px 0 20px 0;\r\n\t}\r\n\t.wrap h1{\r\n\t\tfont-size: 2.3em;\r\n\t\tcolor: #333;\r\n\t\tpadding: 30px 0 10px  0;\r\n\t}\r\n\t.wrap p{\r\n\t\tfont-size: 16px;\r\n\t\tpadding:  0 0 10px 0;\r\n\t}\r\n\t.box{\r\n\t\tdisplay: block;\r\n\t\tbackground: #f2f2f2;\r\n\t\tborder:1px solid #ccc;\r\n\t\tpadding: 20px;\r\n\t\tmargin:20px 0;\r\n\t}\r\n\r\n\t/* Centered texts in each section\r\n\t* --------------------------------------- */\r\n\t.section{\r\n\t\ttext-align:center;\r\n\t}\r\n\r\n\r\n\t/* Bottom menu\r\n\t* --------------------------------------- */\r\n\t#infoMenu li a {\r\n\t\tcolor: #000;\r\n\t}\r\n\t</style>\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section \" id=\"section0\">\r\n\t\t<div class=\"slide\">\r\n\t\t\t<h1>One single section</h1>\r\n\t\t</div>\r\n\t\t<div class=\"slide\">\r\n\t\t\t<h1>And a normal website under it</h1>\r\n\t\t</div>\r\n\r\n\t\t<div class=\"slide\">\r\n\t\t\t<h1>A great single slider!</h1>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n\r\n<div class=\"wrap\">\r\n\t<h1>This is like a normal website.</h1>\r\n\r\n\tJust place the rest of your page after the fullpage wrapper and use the option `fitToSection:false` and `autoScrolling:false`. And enjoy a great single slider.\r\n\t<script src=\"https://gist.github.com/alvarotrigo/368e6d6ad3c5c0e98d3c.js\"></script>\r\n\t<script src=\"https://gist.github.com/alvarotrigo/c74366b59ecba2f9c3da.js\"></script>\r\n\r\n\t<h1> Rest of your site </h1>\r\n\r\n\t<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas a sem ultrices neque vehicula fermentum a sit amet nulla. Donec sed tellus tempor ligula condimentum placerat. Vivamus placerat magna nisi, eu elementum risus imperdiet sit amet. Nunc varius dictum porttitor. Morbi rhoncus magna in quam fringilla fringilla in in odio. Quisque fringilla ante vitae tellus fringilla, condimentum tristique mi pharetra. Aenean ultricies odio at erat facilisis tincidunt. Fusce tempor auctor justo, nec facilisis quam vehicula vel. Aenean non mattis purus, eget lobortis odio. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam cursus elit nec aliquam consequat.\r\n\t</p>\r\n\t<p>\r\n\tNullam sem orci, tincidunt non lorem quis, ultricies blandit nisl. Donec eget sollicitudin tortor. Integer ut orci sit amet ipsum porta feugiat sit amet ut nulla. Vestibulum auctor, tortor sed scelerisque consectetur, nisl tellus placerat tortor, non euismod nisi risus vitae ipsum. Morbi a velit purus. Nam euismod porta sapien, sed scelerisque nulla lacinia vitae. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam at eleifend ligula, in eleifend sapien.\r\n\t</p>\r\n\t<div class=\"box\">\r\n\tIn elementum nec quam et eleifend. Ut nec erat fermentum, mattis leo non, fringilla tellus. Integer at dui nibh. Etiam facilisis fermentum turpis. Nulla malesuada iaculis nisl, ac accumsan felis pulvinar ut. Proin porttitor nulla libero, vel tristique erat faucibus quis. Aliquam pharetra enim et sapien bibendum, interdum viverra lectus sagittis. Vivamus pharetra, risus quis malesuada interdum, mi mauris dignissim mi, ac hendrerit orci nulla vel felis. Vivamus dapibus, nisi vel viverra tincidunt, ligula nunc sagittis elit, eget lacinia tellus velit et leo. Curabitur a tortor pretium, aliquam justo gravida, commodo ipsum. In fermentum lorem eu tincidunt consequat. Donec nec blandit ipsum, id scelerisque velit. Aenean vel ultrices ligula, at imperdiet dolor. Sed euismod turpis et nibh adipiscing feugiat. Etiam diam leo, sollicitudin eu suscipit non, laoreet sit amet dui. In augue purus, semper in blandit ut, suscipit vehicula tortor.\r\n\t</div>\r\n\t<p>\r\n\tPraesent id varius neque. Nunc risus elit, tincidunt eu nulla vitae, adipiscing porta nibh. Pellentesque dignissim dolor ligula, eu vestibulum justo elementum ac. In a risus ullamcorper, iaculis lectus non, condimentum elit. Pellentesque ac felis nec mauris venenatis elementum. In porttitor mauris sit amet posuere scelerisque. Nunc interdum arcu sit amet libero fermentum, nec consequat risus dignissim.\r\n\t</p>\r\n\t<p>\r\n\tCurabitur dui elit, tristique eget venenatis et, scelerisque mattis arcu. Pellentesque lectus orci, tempus in enim et, condimentum rutrum magna. Mauris nec eros viverra, facilisis nibh ut, sodales urna. Pellentesque nec neque in ipsum imperdiet egestas vitae vel augue. Integer felis eros, dictum at eleifend aliquet, lacinia non neque. Curabitur eget condimentum urna, eget sodales lectus. Maecenas blandit ac neque id elementum. Phasellus ultricies vestibulum elit ut sagittis. Nam ut porta mi.\r\n\t</p>\r\n\r\n\r\n\t<h1> Rest of your site </h1>\r\n\r\n\t<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas a sem ultrices neque vehicula fermentum a sit amet nulla. Donec sed tellus tempor ligula condimentum placerat. Vivamus placerat magna nisi, eu elementum risus imperdiet sit amet. Nunc varius dictum porttitor. Morbi rhoncus magna in quam fringilla fringilla in in odio. Quisque fringilla ante vitae tellus fringilla, condimentum tristique mi pharetra. Aenean ultricies odio at erat facilisis tincidunt. Fusce tempor auctor justo, nec facilisis quam vehicula vel. Aenean non mattis purus, eget lobortis odio. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam cursus elit nec aliquam consequat.\r\n\t</p>\r\n\t<p>\r\n\tNullam sem orci, tincidunt non lorem quis, ultricies blandit nisl. Donec eget sollicitudin tortor. Integer ut orci sit amet ipsum porta feugiat sit amet ut nulla. Vestibulum auctor, tortor sed scelerisque consectetur, nisl tellus placerat tortor, non euismod nisi risus vitae ipsum. Morbi a velit purus. Nam euismod porta sapien, sed scelerisque nulla lacinia vitae. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam at eleifend ligula, in eleifend sapien.\r\n\t</p>\r\n\t<p>\r\n\tIn elementum nec quam et eleifend. Ut nec erat fermentum, mattis leo non, fringilla tellus. Integer at dui nibh. Etiam facilisis fermentum turpis. Nulla malesuada iaculis nisl, ac accumsan felis pulvinar ut. Proin porttitor nulla libero, vel tristique erat faucibus quis. Aliquam pharetra enim et sapien bibendum, interdum viverra lectus sagittis. Vivamus pharetra, risus quis malesuada interdum, mi mauris dignissim mi, ac hendrerit orci nulla vel felis. Vivamus dapibus, nisi vel viverra tincidunt, ligula nunc sagittis elit, eget lacinia tellus velit et leo. Curabitur a tortor pretium, aliquam justo gravida, commodo ipsum. In fermentum lorem eu tincidunt consequat. Donec nec blandit ipsum, id scelerisque velit. Aenean vel ultrices ligula, at imperdiet dolor. Sed euismod turpis et nibh adipiscing feugiat. Etiam diam leo, sollicitudin eu suscipit non, laoreet sit amet dui. In augue purus, semper in blandit ut, suscipit vehicula tortor.\r\n\t</p>\r\n\t<p>\r\n\tPraesent id varius neque. Nunc risus elit, tincidunt eu nulla vitae, adipiscing porta nibh. Pellentesque dignissim dolor ligula, eu vestibulum justo elementum ac. In a risus ullamcorper, iaculis lectus non, condimentum elit. Pellentesque ac felis nec mauris venenatis elementum. In porttitor mauris sit amet posuere scelerisque. Nunc interdum arcu sit amet libero fermentum, nec consequat risus dignissim.\r\n\t</p>\r\n\t<div class=\"box\">\r\n\tCurabitur dui elit, tristique eget venenatis et, scelerisque mattis arcu. Pellentesque lectus orci, tempus in enim et, condimentum rutrum magna. Mauris nec eros viverra, facilisis nibh ut, sodales urna. Pellentesque nec neque in ipsum imperdiet egestas vitae vel augue. Integer felis eros, dictum at eleifend aliquet, lacinia non neque. Curabitur eget condimentum urna, eget sodales lectus. Maecenas blandit ac neque id elementum. Phasellus ultricies vestibulum elit ut sagittis. Nam ut porta mi.\r\n\t</div>\r\n\r\n\r\n\t<h1> Rest of your site </h1>\r\n\r\n\t<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas a sem ultrices neque vehicula fermentum a sit amet nulla. Donec sed tellus tempor ligula condimentum placerat. Vivamus placerat magna nisi, eu elementum risus imperdiet sit amet. Nunc varius dictum porttitor. Morbi rhoncus magna in quam fringilla fringilla in in odio. Quisque fringilla ante vitae tellus fringilla, condimentum tristique mi pharetra. Aenean ultricies odio at erat facilisis tincidunt. Fusce tempor auctor justo, nec facilisis quam vehicula vel. Aenean non mattis purus, eget lobortis odio. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam cursus elit nec aliquam consequat.\r\n\t</p>\r\n\t<p>\r\n\tNullam sem orci, tincidunt non lorem quis, ultricies blandit nisl. Donec eget sollicitudin tortor. Integer ut orci sit amet ipsum porta feugiat sit amet ut nulla. Vestibulum auctor, tortor sed scelerisque consectetur, nisl tellus placerat tortor, non euismod nisi risus vitae ipsum. Morbi a velit purus. Nam euismod porta sapien, sed scelerisque nulla lacinia vitae. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam at eleifend ligula, in eleifend sapien.\r\n\t</p>\r\n\t<p>\r\n\tIn elementum nec quam et eleifend. Ut nec erat fermentum, mattis leo non, fringilla tellus. Integer at dui nibh. Etiam facilisis fermentum turpis. Nulla malesuada iaculis nisl, ac accumsan felis pulvinar ut. Proin porttitor nulla libero, vel tristique erat faucibus quis. Aliquam pharetra enim et sapien bibendum, interdum viverra lectus sagittis. Vivamus pharetra, risus quis malesuada interdum, mi mauris dignissim mi, ac hendrerit orci nulla vel felis. Vivamus dapibus, nisi vel viverra tincidunt, ligula nunc sagittis elit, eget lacinia tellus velit et leo. Curabitur a tortor pretium, aliquam justo gravida, commodo ipsum. In fermentum lorem eu tincidunt consequat. Donec nec blandit ipsum, id scelerisque velit. Aenean vel ultrices ligula, at imperdiet dolor. Sed euismod turpis et nibh adipiscing feugiat. Etiam diam leo, sollicitudin eu suscipit non, laoreet sit amet dui. In augue purus, semper in blandit ut, suscipit vehicula tortor.\r\n\t</p>\r\n\t<p>\r\n\tPraesent id varius neque. Nunc risus elit, tincidunt eu nulla vitae, adipiscing porta nibh. Pellentesque dignissim dolor ligula, eu vestibulum justo elementum ac. In a risus ullamcorper, iaculis lectus non, condimentum elit. Pellentesque ac felis nec mauris venenatis elementum. In porttitor mauris sit amet posuere scelerisque. Nunc interdum arcu sit amet libero fermentum, nec consequat risus dignissim.\r\n\t</p>\r\n\t<p>\r\n\tCurabitur dui elit, tristique eget venenatis et, scelerisque mattis arcu. Pellentesque lectus orci, tempus in enim et, condimentum rutrum magna. Mauris nec eros viverra, facilisis nibh ut, sodales urna. Pellentesque nec neque in ipsum imperdiet egestas vitae vel augue. Integer felis eros, dictum at eleifend aliquet, lacinia non neque. Curabitur eget condimentum urna, eget sodales lectus. Maecenas blandit ac neque id elementum. Phasellus ultricies vestibulum elit ut sagittis. Nam ut porta mi.\r\n\t</p>\r\n\r\n\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        anchors: ['firstPage'],\r\n        sectionsColor: ['#4A6FB1'],\r\n        autoScrolling: false,\r\n        css3: true,\r\n        fitToSection: false\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/parallax.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Parallax - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage Parallax example.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,parallax,backgruonds\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/fullPage/extensions/parallax.html\" />\r\n</head>\r\n<body>\r\n\r\nRedirecting...\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/react-fullpage.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>React-fullpage - fullPage.js</title>\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n    <meta name=\"description\" content=\"fullPage auto-height example.\" />\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,auto-height,full-screen\" />\n    <meta name=\"Resource-type\" content=\"Document\" />\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/react-fullpage/\" />\n</head>\n<body>\n\nRedirecting...\n\n</body>\n</html>"
  },
  {
    "path": "examples/reset-sliders.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Reset Sliders - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage Reset Slides example.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,auto-height,full-screen\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/fullPage/extensions/reset-sliders.html\" />\r\n</head>\r\n<body>\r\n\r\nRedirecting...\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/responsive-auto-height.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>Responsive Auto-height - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage full-screen navigation and sections control menu.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,navigation,control arrows, dots\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\t<style>\r\n\r\n\t/* Style for our header texts\r\n\t* --------------------------------------- */\r\n\th1{\r\n\t\tfont-size: 5em;\r\n\t\tfont-family: arial,helvetica;\r\n\t\tcolor: #fff;\r\n\t\tmargin:0;\r\n\t}\r\n\t.intro p{\r\n\t\tcolor: #fff;\r\n\t}\r\n\r\n\t/* Centered texts in each section\r\n\t* --------------------------------------- */\r\n\t.section{\r\n\t\ttext-align:center;\r\n\t}\r\n\r\n\t/* Bottom menu\r\n\t* --------------------------------------- */\r\n\t#infoMenu li a {\r\n\t\tcolor: #fff;\r\n\t}\r\n\t</style>\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section fp-auto-height-responsive\" id=\"section0\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Responsive auto-height</h1>\r\n\t\t\t<p>On responsive mode, which will fire with less than 900px width as defined in `responsiveWidth`, this section will become bigger than the viewport as I'm using the class `fp-auto-height-responsive` on the section.</p>\r\n\t\t\t<br>\r\n\t\t\t<br>\r\n\t\t\t<br>\r\n\t\t\t<p>\r\n\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte. Duo ea saperet tacimates. Sed possim prodesset no, per novum putent doctus ea. Eu mea magna aliquip graecis, pri corpora officiis complectitur ei, lorem saepe consetetur his ad. Meis consulatu ei vis, an altera ocurreret interesset qui. Eu ponderum comprehensam his, case antiopam pri te. Mel ne partem consequat instructior. Ad dicunt malorum sea, ex qui omnes invenire gubergren. Ius cu autem aliquando, pri vide ornatus perpetua an, no has epicuri\r\n\r\n\r\n\t\t\t</p>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t    <div class=\"slide\" id=\"slide1\">\r\n\t\t\t<div class=\"intro\">\r\n\t\t\t\t<h1>Ideal for small screens</h1>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t    <div class=\"slide\" id=\"slide2\">\r\n\t\t\t<h1>This example uses responsiveWidth: 900</h1>\r\n\t\t</div>\r\n\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Keep it simple!</h1>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        anchors: ['firstPage', 'secondPage', '3rdPage'],\r\n        sectionsColor: ['#C63D0F', '#1BBC9B', '#7E8F7C'],\r\n        navigation: true,\r\n        navigationPosition: 'right',\r\n        navigationTooltips: ['First page', 'Second page', 'Third and last page'],\r\n        responsiveWidth: 900,\r\n        afterResponsive: function(isResponsive){\r\n\r\n        }\r\n\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/responsive-height.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>Responsive Height - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage full-screen navigation and sections control menu.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,navigation,control arrows, dots\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\t<style>\r\n\r\n\t/* Style for our header texts\r\n\t* --------------------------------------- */\r\n\th1{\r\n\t\tfont-size: 5em;\r\n\t\tfont-family: arial,helvetica;\r\n\t\tcolor: #fff;\r\n\t\tmargin:0;\r\n\t}\r\n\t.intro p{\r\n\t\tcolor: #fff;\r\n\t}\r\n\r\n\t/* Centered texts in each section\r\n\t* --------------------------------------- */\r\n\t.section{\r\n\t\ttext-align:center;\r\n\t}\r\n\r\n\t/* Bottom menu\r\n\t* --------------------------------------- */\r\n\t#infoMenu li a {\r\n\t\tcolor: #fff;\r\n\t}\r\n\t</style>\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section \" id=\"section0\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Responsive Height</h1>\r\n\t\t\t<p>This example will turn to normal scroll when the window size gets smaller than 600px height</p>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t    <div class=\"slide\" id=\"slide1\">\r\n\t\t\t<div class=\"intro\">\r\n\t\t\t\t<h1>Ideal for small screens</h1>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t    <div class=\"slide\" id=\"slide2\">\r\n\t\t\t<h1>This example uses responsiveHeight: 600</h1>\r\n\t\t</div>\r\n\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Keep it simple!</h1>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        anchors: ['firstPage', 'secondPage', '3rdPage'],\r\n        sectionsColor: ['#C63D0F', '#1BBC9B', '#7E8F7C'],\r\n        responsiveHeight: 600,\r\n        afterResponsive: function(isResponsive){\r\n\r\n        }\r\n    });\r\n</script>\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/responsive-slides.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Responsive Slides - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage Responsive Slides example.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,auto-height,full-screen\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/fullPage/extensions/responsive-slides.html\" />\r\n</head>\r\n<body>\r\n\r\nRedirecting...\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/responsive-width.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>Responsive Width - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage full-screen navigation and sections control menu.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,navigation,control arrows, dots\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\t<style>\r\n\r\n\t/* Style for our header texts\r\n\t* --------------------------------------- */\r\n\th1{\r\n\t\tfont-size: 5em;\r\n\t\tfont-family: arial,helvetica;\r\n\t\tcolor: #fff;\r\n\t\tmargin:0;\r\n\t}\r\n\t.intro p{\r\n\t\tcolor: #fff;\r\n\t}\r\n\r\n\t/* Centered texts in each section\r\n\t* --------------------------------------- */\r\n\t.section{\r\n\t\ttext-align:center;\r\n\t}\r\n\r\n\t/* Bottom menu\r\n\t* --------------------------------------- */\r\n\t#infoMenu li a {\r\n\t\tcolor: #fff;\r\n\t}\r\n\t</style>\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section \" id=\"section0\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Responsive Width</h1>\r\n\t\t\t<p>This example will turn to normal scroll when the window size gets smaller than 900px width</p>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t    <div class=\"slide\" id=\"slide1\">\r\n\t\t\t<div class=\"intro\">\r\n\t\t\t\t<h1>Ideal for small screens</h1>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t    <div class=\"slide\" id=\"slide2\">\r\n\t\t\t<h1>This example uses responsiveWidth: 900</h1>\r\n\t\t</div>\r\n\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Keep it simple!</h1>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        anchors: ['firstPage', 'secondPage', '3rdPage'],\r\n        sectionsColor: ['#C63D0F', '#1BBC9B', '#7E8F7C'],\r\n        navigation: true,\r\n        navigationPosition: 'right',\r\n        navigationTooltips: ['First page', 'Second page', 'Third and last page'],\r\n        responsiveWidth: 900,\r\n        afterResponsive: function(isResponsive){\r\n\r\n        }\r\n\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/rtl.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>RTL Example - fullPage.js</title>\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n    <meta name=\"description\" content=\"fullPage full-screen navigation and sections control menu.\" />\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,scrollbar,scroll,bar,fullscreen,navigation,control arrows, dots\" />\n    <meta name=\"Resource-type\" content=\"Document\" />\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\n    <style>\n\n    /* Style for our header texts\n    * --------------------------------------- */\n    h1{\n        font-size: 5em;\n        font-family: arial,helvetica;\n        color: #fff;\n        margin:0;\n    }\n    .intro p{\n        color: #fff;\n    }\n\n    /* Centered texts in each section\n    * --------------------------------------- */\n    .section{\n        text-align:center;\n    }\n\n\n    /* Bottom menu\n    * --------------------------------------- */\n    #infoMenu li a {\n        color: #fff;\n    }\n    </style>\n\n    <!--[if IE]>\n        <script type=\"text/javascript\">\n             var console = { log: function() {} };\n        </script>\n    <![endif]-->\n</head>\n<body>\n\n<select id=\"demosMenu\">\n    <option selected>Choose Demo</option>\n    <option id=\"simple\">Simple</option>\n    <option id=\"custom-arrows\">Custom arrows</option>\n    <option id=\"hide-sections\">Hide sections</option>\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\n    <option id=\"observer\">Observer</option>\n    <option id=\"jquery-adapter\">jQuery adapter</option>\n    <option id=\"active-slide\">Active section and slide</option>\n    <option id=\"auto-height\">Auto height</option>\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\n    <option id=\"backgrounds\">Background images</option>\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\n    <option id=\"background-video\">Background video</option>\n    <option id=\"callbacks\">Callbacks</option>\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\n    <option id=\"continuous-vertical\">Continuous vertical</option>\n    <option id=\"parallax\">Parallax (premium)</option>\n    <option id=\"cards\">Cards 3d (premium)</option>\n    <option id=\"water-effect\">Water effect (premium)</option>\n    <option id=\"drop-effect\">Drop effect (premium)</option>\n    <option id=\"css3\">CSS3</option>\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\n    <option id=\"easing-css3\">Easing CSS</option>\n    <option id=\"easing-js\">Easing JS</option>\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\n    <option id=\"fixed-headers\">Fixed headers</option>\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\n    <option id=\"looping\">Looping</option>\n    <option id=\"methods\">Methods</option>\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\n    <option id=\"no-anchor\">No anchor links</option>\n    <option id=\"normal-scroll\">Normal scrolling</option>\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\n    <option id=\"offset-sections\">Offset sections (premium)</option>\n    <option id=\"one-section\">One single section</option>\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\n    <option id=\"responsive-height\">Responsive Height</option>\n    <option id=\"responsive-width\">Responsive Width</option>\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\n    <option id=\"scrollBar\">Scroll bar enabled</option>\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\n    <option id=\"lazy-load\">Lazy load</option>\n    <option id=\"scrolling-speed\">Scrolling speed</option>\n        <option id=\"rtl\">RTL</option>\n    <option id=\"trigger-animations\">Trigger animations</option>\n    <option id=\"vue-fullpage\">Vue component</option>\n    <option id=\"react-fullpage\">React component</option>\n    <option id=\"angular-fullpage\">Angular component</option>\n  </select>\n\n\n<div id=\"fullpage\">\n    <div class=\"section \" id=\"section0\">\n        <div class=\"intro\">\n            <h1>RTL and LTR Support!</h1>\n            <p>For all languages!</p>\n        </div>\n    </div>\n    <div class=\"section\" id=\"section1\">\n        <div class=\"slide\" id=\"slide1\">\n            <div class=\"intro\">\n                <h1>Section 2.1</h1>\n            </div>\n        </div>\n\n        <div class=\"slide\" id=\"slide2\">\n            <div class=\"intro\">\n                <h1>Section 2.2</h1>\n            </div>\n        </div>\n\n        <div class=\"slide\" id=\"slide2\">\n            <div class=\"intro\">\n                <h1>Section 2.3</h1>\n            </div>\n        </div>\n\n    </div>\n    <div class=\"section\" id=\"section2\">\n        <div class=\"intro\">\n            <h1>Section 3</h1>\n        </div>\n    </div>\n</div>\n\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\n<script type=\"text/javascript\" src=\"examples.js\"></script>\n\n<script type=\"text/javascript\">\n    var myFullpage = new fullpage('#fullpage', {\n        anchors: ['firstPage', 'secondPage', '3rdPage'],\n        sectionsColor: ['#C63D0F', '#1BBC9B', '#7E8F7C'],\n        rtl: true\n    });\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "examples/scroll-after-fullpage.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>Scroll After Fullpage - fullPage.js</title>\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n    <meta name=\"description\" content=\"fullPage full-screen navigation and sections control menu.\" />\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,navigation,control arrows, dots\" />\n    <meta name=\"Resource-type\" content=\"Document\" />\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\n    <style>\n\n    /* Style for our header texts\n    * --------------------------------------- */\n    h1{\n        font-size: 5em;\n        font-family: arial,helvetica;\n        color: #fff;\n        margin:0;\n    }\n    .intro p{\n        color: #fff;\n    }\n\n    /* Centered texts in each section\n    * --------------------------------------- */\n    .section{\n        text-align:center;\n    }\n\n    /* Bottom menu\n    * --------------------------------------- */\n    #infoMenu li a {\n        color: #fff;\n    }\n    .box{\n        margin: 3em auto;\n        max-width: 800px;\n        padding: 4em;\n        width: 90%;\n        background: rgb(245 158 235);\n    }\n    .box h1{\n        margin-bottom: 1em;\n    }\n    </style>\n</head>\n<body>\n\n<ul id=\"menu\">\n    <li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">First slide</a></li>\n    <li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second slide</a></li>\n    <li data-menuanchor=\"3rdPage\"><a href=\"#3rdPage\">Third slide</a></li>\n</ul>\n\n\n<select id=\"demosMenu\">\n    <option selected>Choose Demo</option>\n    <option id=\"simple\">Simple</option>\n    <option id=\"custom-arrows\">Custom arrows</option>\n    <option id=\"hide-sections\">Hide sections</option>\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\n    <option id=\"observer\">Observer</option>\n    <option id=\"jquery-adapter\">jQuery adapter</option>\n    <option id=\"active-slide\">Active section and slide</option>\n    <option id=\"auto-height\">Auto height</option>\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\n    <option id=\"backgrounds\">Background images</option>\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\n    <option id=\"background-video\">Background video</option>\n    <option id=\"callbacks\">Callbacks</option>\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\n    <option id=\"continuous-vertical\">Continuous vertical</option>\n    <option id=\"parallax\">Parallax (premium)</option>\n    <option id=\"cards\">Cards 3d (premium)</option>\n    <option id=\"water-effect\">Water effect (premium)</option>\n    <option id=\"drop-effect\">Drop effect (premium)</option>\n    <option id=\"css3\">CSS3</option>\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\n    <option id=\"easing-css3\">Easing CSS</option>\n    <option id=\"easing-js\">Easing JS</option>\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\n    <option id=\"fixed-headers\">Fixed headers</option>\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\n    <option id=\"looping\">Looping</option>\n    <option id=\"methods\">Methods</option>\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\n    <option id=\"no-anchor\">No anchor links</option>\n    <option id=\"normal-scroll\">Normal scrolling</option>\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\n    <option id=\"offset-sections\">Offset sections (premium)</option>\n    <option id=\"one-section\">One single section</option>\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\n    <option id=\"responsive-height\">Responsive Height</option>\n    <option id=\"responsive-width\">Responsive Width</option>\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\n    <option id=\"scrollBar\">Scroll bar enabled</option>\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\n    <option id=\"lazy-load\">Lazy load</option>\n    <option id=\"scrolling-speed\">Scrolling speed</option>\n    <option id=\"rtl\">RTL</option>\n    <option id=\"trigger-animations\">Trigger animations</option>\n    <option id=\"vue-fullpage\">Vue component</option>\n    <option id=\"react-fullpage\">React component</option>\n    <option id=\"angular-fullpage\">Angular component</option>\n  </select>\n\n<!-- fullPage.js container -->\n<div id=\"fullpage\" >\n    <div class=\"section hidden\" id=\"section1\">\n        <div class=\"slide\">\n            <h1>Section 1.1</h1>\n        </div>\n        <div class=\"slide desktopOnly\">\n            <h1>Section 1.2</h1>\n        </div>\n        <div class=\"slide\">\n            <h1>Section 1.2</h1>\n        </div>\n    </div>\n    <div class=\"section desktopOnly\" id=\"section2\" data-disable=\"down\">\n        <h1>Section 2</h1>\n    </div>\n    <div class=\"section\" id=\"section4\">\n        <h1>Section 3</h1>\n    </div>\n</div>\n\n<!-- Normal Scroll From Here On -->\n<div class=\"content\">\n    <div class=\"box\">\n        <h1>Normal Scroll After Fullpage.js</h1>\n        <p>\n            Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.\n        </p>\n    </div>\n\n    <div class=\"box\">\n        <h1>Normal Scroll After Fullpage.js</h1>\n        <p>\n            Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.\n        </p>\n    </div>\n\n    <div class=\"box\">\n        <h1>Normal Scroll After Fullpage.js</h1>\n        <p>\n            Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.\n        </p>\n    </div>\n\n\n\n</div>\n\n<script type=\"text/javascript\" src=\"../dist/fullpage.js?v=7\"></script>\n<script type=\"text/javascript\" src=\"../examples/examples.js\"></script>\n\n<script type=\"text/javascript\">\n    var myFullpage = new fullpage('#fullpage', {\n        sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE', 'orange', '#ccddff'],\n        anchors: ['firstPage', 'secondPage', '3rdPage', '4thpage', 'lastPage', 'more0', 'more1', 'more2', 'more3', 'more4'],\n        slidesNavigation: true, \n        navigation: true,\n        menu: '#menu',\n        scrollBar: true\n    });\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "examples/scroll-horizontally.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Scroll Horizontally - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage auto-height example.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,auto-height,full-screen\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/fullPage/extensions/scrollHorizontally.html\" />\r\n</head>\r\n<body>\r\n\r\nRedirecting...\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/scrollBar.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>Scroll bar enabled - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage full-screen navigation and sections control menu.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,demo,scrollbar,scroll,bar,fullscreen,navigation,control arrows, dots\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\t<style>\r\n\r\n\t/* Style for our header texts\r\n\t* --------------------------------------- */\r\n\th1{\r\n\t\tfont-size: 5em;\r\n\t\tfont-family: arial,helvetica;\r\n\t\tcolor: #fff;\r\n\t\tmargin:0;\r\n\t}\r\n\t.intro p{\r\n\t\tcolor: #fff;\r\n\t}\r\n\r\n\t/* Centered texts in each section\r\n\t* --------------------------------------- */\r\n\t.section{\r\n\t\ttext-align:center;\r\n\t}\r\n\r\n\r\n\t/* Bottom menu\r\n\t* --------------------------------------- */\r\n\t#infoMenu li a {\r\n\t\tcolor: #fff;\r\n\t}\r\n\t</style>\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section \" id=\"section0\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Enable Your Scroll Bar!</h1>\r\n\t\t\t<p>The perfect combination!</p>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t    <div class=\"slide\" id=\"slide1\">\r\n\t\t\t<div class=\"intro\">\r\n\t\t\t\t<h1>Free scroll</h1>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tUser can still using the scroll bar and fullPage.js will do the rest!\r\n\t\t\t\t</p>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t    <div class=\"slide\" id=\"slide2\">\r\n\t\t\t<h1>Slide 2</h1>\r\n\t\t</div>\r\n\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Great User Experience!</h1>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        anchors: ['firstPage', 'secondPage', '3rdPage'],\r\n        sectionsColor: ['#C63D0F', '#1BBC9B', '#7E8F7C'],\r\n        scrollBar: true\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/scrollOverflow-reset.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>scrollOverflow Reset - fullPage.js</title>\r\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n    <meta name=\"description\" content=\"fullPage ScrollOverflow Reset example.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,auto-height,full-screen\" />\r\n    <meta name=\"Resource-type\" content=\"Document\" />\r\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/fullPage/extensions/scrolloverflow-reset.html\" />\r\n</head>\r\n<body>\r\n\r\nRedirecting...\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/scrollOverflow.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n    <title>Scroll inside sections and slides - Scrolloverflow - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage scroll inside sections and slides. Scrolloverflow option.\" />\r\n    <meta name=\"keywords\"  content=\"fullpage,scrolloverflow,inside,overflow,scroll,jquery,demo,screen,fullscreen,backgrounds,full-screen\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\t<style>\r\n\r\n\t/* Style for our header texts\r\n\t* --------------------------------------- */\r\n\th1{\r\n\t\tfont-size: 5em;\r\n\t\tfont-family: arial,helvetica;\r\n\t\tcolor: #fff;\r\n\t\tmargin:0;\r\n\t\tpadding:40px 0 0 0;\r\n\t}\r\n\t.intro p{\r\n\t\tcolor: #fff;\r\n\t\tpadding:40px 0 0 0;\r\n\t}\r\n\r\n\t/* Centered texts in each section\r\n\t* --------------------------------------- */\r\n\t.section{\r\n\t\ttext-align:center;\r\n\t}\r\n\r\n\r\n\t/* Bottom menu\r\n\t* --------------------------------------- */\r\n\t#infoMenu li a {\r\n\t\tcolor: #fff;\r\n\t}\r\n\t</style>\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section\" id=\"section0\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Scrolling inside sections</h1>\r\n\t\t\t<p>Easy and useful! Just make use of the option `scrollOverflow` for it and add the `scrolloverflow` vendor libary! <br></p>\r\n\r\n\r\n\t\t\t\r\n\t\t  </p>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t    <div class=\"slide\" id=\"slide1\">\r\n\t\t\t<div class=\"intro\">\r\n\t\t\t\t<h1>Also in sections</h1>\r\n\t\t\t\t<img src=\"./imgs/iphone-two.png\" alt=\"iphone\" id=\"iphone-two\" />\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t    <div class=\"slide\" id=\"slide2\"><h1>Even inside slides</h1></div>\r\n\t\t<div class=\"slide\" id=\"slide3\">\r\n\t\t\t<div class=\"intro\">\r\n\t\t\t\t<h1>Scrolling slide</h1>\r\n\t\t\t\t<img src=\"./imgs/iphone-red.png\" alt=\"iphone\" id=\"iphone-two\" />\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t\t<p>\r\n\t\t\t\t\tEu nec ferri molestie consequat, vel at alia dolore putant. Labore philosophia ut vix. In vis nostrud interesset appellantur, vis et tation feugiat scripserit. Te nec noster suavitate persecuti. Diceret erroribus cu vix, alii omnes ei sit. Sea an corrumpit patrioque, virtute accumsan nominavi et usu, ex mei dolore vocibus incorrupte.\r\n\t\t\t\t</p>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>No limitations!</h1>\r\n\t\t\t<p>Content is a priority. Even if it is so large :)</p>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        anchors: ['firstPage', 'secondPage', '3rdPage', '4thPage'],\r\n        sectionsColor: ['#4A6FB1', '#939FAA', '#323539'],\r\n        scrollOverflow: true,\r\n\t\tonScrollOverflow: function(section, slide, position, direction){\r\n            var params = {\r\n                section: section,\r\n                slide: slide,\r\n                position: position,\r\n                direction: direction\r\n            };\r\n\r\n            console.log(\"--- onScrollOverflow ---\");\r\n            console.log(params);\r\n        }\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "examples/scrolling-speed.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>Scrolling speed - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage demo scrolling speed.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,demo,scrolling,speed,scrollingSpeed\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n<ul id=\"menu\">\r\n\t<li data-menuanchor=\"firstPage\"><a href=\"#firstPage\">First slide</a></li>\r\n\t<li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second slide</a></li>\r\n\t<li data-menuanchor=\"3rdPage\"><a href=\"#3rdPage\">Third slide</a></li>\r\n</ul>\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section \" id=\"section0\">\r\n\t\t<h1>fullPage.js</h1>\r\n\t\t<p>Configure the scrolling speed!</p>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t    <div class=\"slide\">\r\n\t\t\t<div class=\"intro\">\r\n\t\t\t\t<h1>Slow scrolling speed</h1>\r\n\t\t\t\t<p>In case we want to make a site for old people, for example :)</p>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t    <div class=\"slide\">\r\n\t\t\t<div class=\"intro\">\r\n\t\t\t\t<h1>Landscape too</h1>\r\n\t\t\t\t<p>Also applied to landscape slides. Great uh?</p>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Try it out</h1>\r\n\t\t\t<p>Slower it down or speed it up</p>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE', 'whitesmoke', '#ccddff'],\r\n        anchors: ['firstPage', 'secondPage', '3rdPage', '4thpage', 'lastPage'],\r\n        menu: '#menu',\r\n        scrollingSpeed: 1700\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "examples/simple.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>fullPage.js A simple Demo</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage very simple demo.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,demo,simple\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n</head>\r\n<body>\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (paid)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (paid)</option>\r\n    <option id=\"cards\">Cards 3d (paid)</option>\r\n    <option id=\"water-effect\">Water effect (paid)</option>\r\n    <option id=\"drop-effect\">Drop effect (paid)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (paid)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (paid)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (paid)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (paid)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (paid)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (paid)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (paid)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (paid)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section active\" id=\"section0\"><h1>fullPage.js</h1></div>\r\n\t<div class=\"section\" id=\"section1\">\r\n\t    <div class=\"slide \"><h1>Simple Demo</h1></div>\r\n\t    <div class=\"slide active\"><h1>Only text</h1></div>\r\n\t    <div class=\"slide\"><h1>And text</h1></div>\r\n\t    <div class=\"slide\"><h1>And more text</h1></div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\"><h1>No wraps, no extra markup</h1></div>\r\n\t<div class=\"section\" id=\"section3\"><h1>Just the simplest demo ever</h1></div>\r\n</div>\r\n\r\n\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\">\r\n\tvar myFullpage = new fullpage('#fullpage', {\r\n\t\tsectionsColor: ['#f2f2f2', '#4BBFC3', '#7BAABE', 'whitesmoke', '#ccddff']\r\n\t});\r\n</script>\r\n</body>\r\n</html>"
  },
  {
    "path": "examples/skipIntermediateItems.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>Skip Intermediate Slides or Sections - fullPage.js</title>\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n    <meta name=\"description\" content=\"fullPage - Skip Intermediate sections and slides. Jump non consecutive siblings without animation.\" />\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,skipIntermediateItems,skip,ignore,jump,inmediate,siblings\" />\n    <meta name=\"Resource-type\" content=\"Document\" />\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\n    <style>\n\n    /* Style for our header texts\n    * --------------------------------------- */\n    h1{\n        font-size: 5em;\n        font-family: arial,helvetica;\n        color: #fff;\n        margin:0;\n    }\n    .intro p{\n        color: #fff;\n    }\n\n    /* Centered texts in each section\n    * --------------------------------------- */\n    .section{\n        text-align:center;\n    }\n\n\n    /* Bottom menu\n    * --------------------------------------- */\n    #infoMenu li a {\n        color: #fff;\n    }\n    </style>\n\n    <!--[if IE]>\n        <script type=\"text/javascript\">\n             var console = { log: function() {} };\n        </script>\n    <![endif]-->\n</head>\n<body>\n\n<select id=\"demosMenu\">\n    <option selected>Choose Demo</option>\n    <option id=\"simple\">Simple</option>\n    <option id=\"custom-arrows\">Custom arrows</option>\n    <option id=\"hide-sections\">Hide sections</option>\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\n    <option id=\"observer\">Observer</option>\n    <option id=\"jquery-adapter\">jQuery adapter</option>\n    <option id=\"active-slide\">Active section and slide</option>\n    <option id=\"auto-height\">Auto height</option>\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\n    <option id=\"backgrounds\">Background images</option>\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\n    <option id=\"background-video\">Background video</option>\n    <option id=\"callbacks\">Callbacks</option>\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\n    <option id=\"continuous-vertical\">Continuous vertical</option>\n    <option id=\"parallax\">Parallax (premium)</option>\n    <option id=\"cards\">Cards 3d (premium)</option>\n    <option id=\"water-effect\">Water effect (premium)</option>\n    <option id=\"drop-effect\">Drop effect (premium)</option>\n    <option id=\"css3\">CSS3</option>\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\n    <option id=\"easing-css3\">Easing CSS</option>\n    <option id=\"easing-js\">Easing JS</option>\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\n    <option id=\"fixed-headers\">Fixed headers</option>\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\n    <option id=\"looping\">Looping</option>\n    <option id=\"methods\">Methods</option>\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\n    <option id=\"no-anchor\">No anchor links</option>\n    <option id=\"normal-scroll\">Normal scrolling</option>\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\n    <option id=\"offset-sections\">Offset sections (premium)</option>\n    <option id=\"one-section\">One single section</option>\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\n    <option id=\"responsive-height\">Responsive Height</option>\n    <option id=\"responsive-width\">Responsive Width</option>\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\n    <option id=\"scrollBar\">Scroll bar enabled</option>\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\n    <option id=\"lazy-load\">Lazy load</option>\n    <option id=\"scrolling-speed\">Scrolling speed</option>\n    <option id=\"rtl\">RTL</option>\n    <option id=\"trigger-animations\">Trigger animations</option>\n    <option id=\"vue-fullpage\">Vue component</option>\n    <option id=\"react-fullpage\">React component</option>\n    <option id=\"angular-fullpage\">Angular component</option>\n  </select>\n\n\n<div id=\"fullpage\">\n    <div class=\"section\">\n        <h1>Section 1</h1>\n        <p>\n            <a href=\"#3rdPage\">Link to section 3</a>\n        </p>\n    </div>\n    <div class=\"section\">\n        <div class=\"slide\"><h1>Slide 2.1</h1></div>\n        <div class=\"slide\"><h1>Slide 2.2</h1></div>\n        <div class=\"slide\"><h1>Slide 2.3</h1></div>\n        <div class=\"slide\"><h1>Slide 2.4</h1></div>\n    </div>\n    <div class=\"section\">\n        <h1>Section 3</h1>\n    </div>\n    <div class=\"section\">\n        <h1>Section 4</h1>\n    </div>\n</div>\n\n<script type=\"text/javascript\" src=\"../dist/fullpage.min.js\"></script>\n<script type=\"text/javascript\" src=\"examples.js\"></script>\n\n<script type=\"text/javascript\">\n    var myFullpage = new fullpage('#fullpage', {\n        anchors: ['firstPage', 'secondPage', '3rdPage'],\n        sectionsColor: ['#C63D0F', '#1BBC9B', '#7E8F7C', 'orange'],\n        navigation: true,\n        slidesNavigation: true,\n\n        // default is false\n        skipIntermediateItems: true\n\n        // possible values\n        // skipIntermediateItems: 'slides'\n        // skipIntermediateItems: 'sections'\n        // skipIntermediateItems: false\n    });\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "examples/trigger-animations.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t<title>Callbacks - fullPage.js</title>\r\n\t<meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\r\n\t<meta name=\"description\" content=\"fullPage callback function.\" />\r\n\t<meta name=\"keywords\"  content=\"fullpage,jquery,demo,callbac,function,event\" />\r\n\t<meta name=\"Resource-type\" content=\"Document\" />\r\n\r\n\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/fullpage.css\" />\r\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"examples.css\" />\r\n\r\n\t<!--[if IE]>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t var console = { log: function() {} };\r\n\t\t</script>\r\n\t<![endif]-->\r\n\r\n\t<style>\r\n\t\t#section2 img{\r\n\t\t\tleft: 130%;\r\n\t\t\tposition:relative;\r\n      transition: all 600ms ease;\r\n\t\t}\r\n\t\t#section2 p{\r\n\t\t\topacity: 0;\r\n      transition: all 600ms ease;\r\n\t\t}\r\n\t\t#section3 .intro{\r\n\t\t\tleft: -130%;\r\n\t\t\tposition:relative;\r\n      transition: all 600ms ease;\r\n\t\t}\r\n\r\n    #section3 .intro{\r\n      left: -130%;\r\n      position:relative;\r\n      transition: all 600ms ease;\r\n    }\r\n\r\n    /**\r\n    * Here we fire the animation for section 3.\r\n    * As the fp-viewing class in the body changes on each section and slide.\r\n    */\r\n    body.fp-viewing-3rdPage #section3 .intro{\r\n       left: 0%;\r\n    }\r\n\t</style>\r\n</head>\r\n<body>\r\n\r\n\r\n<select id=\"demosMenu\">\r\n    <option selected>Choose Demo</option>\r\n    <option id=\"simple\">Simple</option>\r\n    <option id=\"custom-arrows\">Custom arrows</option>\r\n    <option id=\"hide-sections\">Hide sections</option>\r\n    <option id=\"scroll-after-fullpage\">Scroll after fullpage</option>\r\n    <option id=\"observer\">Observer</option>\r\n    <option id=\"jquery-adapter\">jQuery adapter</option>\r\n    <option id=\"active-slide\">Active section and slide</option>\r\n    <option id=\"auto-height\">Auto height</option>\r\n    <option id=\"autoplay-video-and-audio\">Autoplay Video and Audio</option>\r\n    <option id=\"backgrounds\">Background images</option>\r\n    <option id=\"backgrounds-fixed\">Fixed fullscreen backgrounds</option>\r\n    <option id=\"background-video\">Background video</option>\r\n    <option id=\"callbacks\">Callbacks</option>\r\n    <option id=\"continuous-horizontal\">Continuous horizontal (premium)</option>\r\n    <option id=\"continuous-vertical\">Continuous vertical</option>\r\n    <option id=\"parallax\">Parallax (premium)</option>\r\n    <option id=\"cards\">Cards 3d (premium)</option>\r\n    <option id=\"water-effect\">Water effect (premium)</option>\r\n    <option id=\"drop-effect\">Drop effect (premium)</option>\r\n    <option id=\"css3\">CSS3</option>\r\n    <option id=\"drag-and-move\">Drag And Move (premium)</option>\r\n    <option id=\"easing-css3\">Easing CSS</option>\r\n    <option id=\"easing-js\">Easing JS</option>\r\n    <option id=\"fading-effect\">Fading Effect (premium)</option>\r\n    <option id=\"fixed-headers\">Fixed headers</option>\r\n    <option id=\"gradient-backgrounds\">Gradient backgrounds</option>\r\n    <option id=\"interlocked-slides\">Interlocked Slides (premium)</option>\r\n    <option id=\"looping\">Looping</option>\r\n    <option id=\"methods\">Methods</option>\r\n    <option id=\"navigation-vertical\">Vertical navigation dots</option>\r\n    <option id=\"navigation-horizontal\">Horizontal navigation dots</option>\r\n    <option id=\"navigation-tooltips\">Navigation tooltips</option>\r\n    <option id=\"no-anchor\">No anchor links</option>\r\n    <option id=\"normal-scroll\">Normal scrolling</option>\r\n    <option id=\"normalScrollElements\">Normal scroll elements</option>\r\n    <option id=\"offset-sections\">Offset sections (premium)</option>\r\n    <option id=\"one-section\">One single section</option>\r\n    <option id=\"reset-sliders\">Reset sliders (premium)</option>\r\n    <option id=\"responsive-auto-height\">Responsive Auto Height</option>\r\n    <option id=\"responsive-height\">Responsive Height</option>\r\n    <option id=\"responsive-width\">Responsive Width</option>\r\n    <option id=\"responsive-slides\">Responsive Slides (premium)</option>\r\n    <option id=\"scrollBar\">Scroll bar enabled</option>\r\n    <option id=\"scroll-horizontally\">Scroll horizontally (premium)</option>\r\n    <option id=\"scrollOverflow\">Scroll inside sections and slides</option>\r\n    <option id=\"scrollOverflow-reset\">ScrollOverflow Reset (premium)</option>\r\n    <option id=\"lazy-load\">Lazy load</option>\r\n    <option id=\"scrolling-speed\">Scrolling speed</option>\r\n    <option id=\"rtl\">RTL</option>\r\n    <option id=\"trigger-animations\">Trigger animations</option>\r\n    <option id=\"vue-fullpage\">Vue component</option>\r\n    <option id=\"react-fullpage\">React component</option>\r\n    <option id=\"angular-fullpage\">Angular component</option>\r\n  </select>\r\n\r\n<ul id=\"menu\">\r\n\t<li data-menuanchor=\"firstPage\"><a href=\"#firstPage\">First slide</a></li>\r\n\t<li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second slide</a></li>\r\n\t<li data-menuanchor=\"3rdPage\"><a href=\"#3rdPage\">Third slide</a></li>\r\n</ul>\r\n\r\n<div id=\"fullpage\">\r\n\t<div class=\"section \" id=\"section1\">\r\n    <div class=\"intro\">\r\n  \t\t<h1>Animations</h1>\r\n  \t\t<p>You can make use of <a href=\"https://github.com/alvarotrigo/fullPage.js#callbacks\" target=\"_blank\">callbacks</a> or <a href=\"https://github.com/alvarotrigo/fullPage.js#state-classes-added-by-fullpagejs\" target=\"_blank\">state classes</a> to fire animations.</p>\r\n  \t\t<p>See my video tutorial regarding how to create css3 animations too!</p>\r\n      <iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/qiCVPpI9l3M\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen></iframe>\r\n    </div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section2\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<img src=\"imgs/1.png\" alt=\"Cool\" />\r\n\t\t\t<h1>From the callbacks</h1>\r\n\t\t\t<p>Animation fired through fullPage.js callbacks, making use of css3 transitions.</p>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"section\" id=\"section3\">\r\n\t\t<div class=\"intro\">\r\n\t\t\t<h1>Cool uh?</h1>\r\n\t\t\t<p>Choose the best easing effect for your site!</p>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<script type=\"text/javascript\" src=\"../dist/fullpage.js\"></script>\r\n<script type=\"text/javascript\" src=\"examples.js\"></script>\r\n<script type=\"text/javascript\">\r\n    var myFullpage = new fullpage('#fullpage', {\r\n        sectionsColor: ['#1bbc9b', '#4BBFC3', '#7BAABE', 'whitesmoke', '#ccddff'],\r\n        anchors: ['firstPage', 'secondPage', '3rdPage', '4thpage', 'lastPage'],\r\n        menu: '#menu',\r\n        afterLoad: function(origin, destination, direction){\r\n            //section 2\r\n            if(destination.index == 1){\r\n                document.querySelector('#section2').querySelector('img').style.left = 0 + 'px';\r\n                document.querySelector('#section2').querySelector('p').style.opacity = 1;\r\n            }\r\n\r\n            //back to original state\r\n            else if(origin && origin.index == 1){\r\n                document.querySelector('#section2').querySelector('img').style.left = 130 + '%';\r\n                document.querySelector('#section2').querySelector('p').style.opacity = 0;\r\n            }\r\n\r\n            //section 3 is using the state classes to fire the animation\r\n            //see the CSS code above!\r\n        }\r\n    });\r\n</script>\r\n\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "examples/vue-fullpage.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>Vue-fullpage - fullPage.js</title>\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n    <meta name=\"description\" content=\"fullPage auto-height example.\" />\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,auto-height,full-screen\" />\n    <meta name=\"Resource-type\" content=\"Document\" />\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/vue-fullpage/\" />\n</head>\n<body>\n\nRedirecting...\n\n</body>\n</html>"
  },
  {
    "path": "examples/water-effect.html",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>Water Effect - fullPage.js</title>\n    <meta name=\"author\" content=\"Alvaro Trigo Lopez\" />\n    <meta name=\"description\" content=\"fullPage Water Effect extension example.\" />\n    <meta name=\"keywords\"  content=\"fullpage,jquery,demo,screen,fullscreen,auto-height,full-screen\" />\n    <meta name=\"Resource-type\" content=\"Document\" />\n    <meta http-equiv=\"refresh\" content=\"0; url=http://alvarotrigo.com/fullPage/extensions/water-effect.html\" />\n</head>\n<body>\n\nRedirecting...\n\n</body>\n</html>"
  },
  {
    "path": "gulp/build.js",
    "content": "var gulp = require('gulp');\nvar rename = require('gulp-rename');\nvar sourcemaps = require('gulp-sourcemaps');\nvar uglify = require('gulp-uglify');\nvar minifyCss = require('gulp-clean-css');\nvar replace = require('gulp-replace');\nvar fpPackage = require('../package.json');\n\ngulp.task('css', function(done) {\n    gulp.src('./src/css/fullpage.css')\n        .pipe(sourcemaps.init())\n        .pipe(gulp.dest('./dist'))\n        .pipe(minifyCss({\n            compatibility: 'ie8',\n            advanced: false,\n            keepSpecialComments: '1'\n        }))\n        .pipe(rename({suffix: '.min'}))\n        .pipe(sourcemaps.write('.'))\n        .pipe(gulp.dest('./dist'));\n        done();\n});\n\n/**\n * Updates version number in credit comments, window variable and README.md\n */\ngulp.task('update-version', function(done){\n\n    // updating sources\n    gulp.src([\n        './src/js/fullpage.js',\n        './src/js-extensions/fullpage.js',\n        './rollup.config.js',\n        './rollup.ext.config.js',\n        './src/css/fullpage.css'\n    ], { base: \"./\" })\n        .pipe(replace(/(FP\\.version = ')([\\d\\.])+(')/g, \"$1\" + fpPackage.version + \"$3\"))\n        .pipe(replace(/(fullPage )([\\d\\.]+)/g, \"$1\" + fpPackage.version))\n        .pipe(gulp.dest('.'));\n\n    // updating readme version\n    gulp.src([\n        './README.md',\n        './lang/brazilian-portuguese/README.md',\n        './lang/chinese/README.md',\n        './lang/french/README.md',\n        './lang/japanese/README.md',\n        './lang/korean/README.md',\n        './lang/russian/README.md',\n        './lang/spanish/README.md'\n    ], { base: \"./\" })\n        .pipe(replace(/(fullPage.js-v)([\\d\\.]+)/g, \"$1\" + fpPackage.version))\n        .pipe(gulp.dest('.'));\n\n    done();\n});\n\ngulp.task('vendors', function(done) {\n    gulp.src([\n        './vendors/easings.js'\n        ])\n        .pipe(sourcemaps.init())\n        .pipe(gulp.dest('./vendors'))\n        .pipe(uglify({\n            output: {\n                comments: 'some'\n            }\n        }))\n        .pipe(rename({suffix: '.min'}))\n        .pipe(sourcemaps.write('.'))\n        .pipe(gulp.dest('./vendors'));\n        done();\n});\n\ngulp.task('default', gulp.series('update-version', 'css'));"
  },
  {
    "path": "gulpfile.js",
    "content": "var gulp = require('gulp');\n\nvar requireDir = require('require-dir');\nrequireDir('./gulp');\n\ngulp.task('default', gulp.series('default', 'secret'));"
  },
  {
    "path": "lang/brazilian-portuguese/README.md",
    "content": "# fullPage.js\n![preview](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/intro.png)\n![compatibility](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/compatible.png)\n\n<p align=\"center\">\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/#fullpagejs\">English</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish#fullpagejs\">Español</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#fullpagejs\">Français</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian#fullpagejs\">Pусский</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese#fullpagejs\">中文</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#fullpagejs\">한국어</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese#fullpagejs\"> 日本語</a> | \n  <span>Português Brasileiro</span>\n</p>\n\n<p align=\"center\">\n\tDisponível para <a href=\"https://github.com/alvarotrigo/vue-fullpage.js\">Vue</a>, <a href=\"https://github.com/alvarotrigo/react-fullpage\">React</a> e <a href=\"https://github.com/alvarotrigo/angular-fullpage\">Angular</a>.\n</p>\n\n---\n\n![fullPage.js version](https://img.shields.io/badge/fullPage.js-v4.0.41-brightgreen.svg)\n[![License](https://img.shields.io/badge/License-GPL-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.html)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/fullpage.js/badge?style=rounded)](https://www.jsdelivr.com/package/npm/fullpage.js)\n[![Minzipped Size](https://img.shields.io/bundlephobia/minzip/fullpage.js)](https://bundlephobia.com/package/fullpage.js)\n&nbsp;&nbsp;**|**&nbsp;&nbsp; *Created by [@imac2](https://twitter.com/imac2)*\n\n- [Demo online](https://alvarotrigo.com/fullPage/) | [Codepen](https://codepen.io/alvarotrigo/pen/NxyPPp)\n- [Wordpress plugin for Gutenberg](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/) and [WordPress plugin for Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/)\n- [Tema para Wordpress](https://alvarotrigo.com/fullPage/utils/wordpress.html)\n- [Extensões fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/)\n- [Perguntas Frequentes](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions)\n- [Migration from fullPage v3 to fullpage v4](https://alvarotrigo.com/fullPage/help/migration-from-fullpage-3/)\n---\n\nUma biblioteca simples e fácil de usar que cria sites de rolagem em tela cheia (também conhecidos como sites de página única ou sites de uma página) e adiciona controles deslizantes de paisagem dentro das seções do site.\n\n- [Introdução](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#introdução)\n- [Compatibilidade](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#compatibilidade)\n- [Licença](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#licença)\n- [Uso](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#uso)\n  - [Criando Links para seções ou slides](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#criando-links-para-secoes-ou-slides)\n  - [Criando seções maiores ou menores](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#criando-secoes-maiores-ou-menores)\n  - [Classes de estado adicionadas pelo fullPage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#classes-de-estado-adicionadas-pelo-fullpagejs)\n  - [Lazy loading](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#lazy-loading)\n  - [Reprodução/pausa automática de mídias embutidas](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#reproducaopausa-automática-de-mídias-embutidas)\n  - [Uso de extensões](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#uso-de-extensões)\n- [Opções](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#opções)\n- [Métodos](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#métodos)\n- [Callbacks](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#callbacks)\n- [Relatando problemas](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#relatando-problemas)\n- [Contribuindo para o fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#contribuindo-para-o-fullpagejs)\n- [Changelog](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#changelog)\n- [Tarefas de Build](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#tarefas-de-build)\n- [Recursos](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#recursos)\n- [Quem está usando o fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#quem-está-usando-o-fullpagejs)\n- [Doações](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#doações)\n- [Patrocinadores](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#patrocinadores)\n\n## Introdução\nSugestões são mais do que bem vindas, não apenas para solicitações de funções mas também para melhorias de estilo de código.\nVamos fazer isso ser uma boa biblioteca para tornar a vida das pessoas mais fácil!\n\n## Compatibilidade\nfullPage.js é totalmente funcional em todos os navegadores modernos e no IE 11. Se você precisa dar suporte a versões anteriores ao IE 11, considere usar [fullPage.js v3](https://github.com/alvarotrigo/fullPage.js/tree/3.1.2).\nEle também dá suporte ao toque para dispositivos móveis, tablets e computadores touch screen.\n\nUm agradeicmento especial para [Browserstack](https://www.browserstack.com/) por apoiar o fullpage.js.\n\n## Licença\n\n### Licença comercial\nSe você quiser usar fullPage para desenvolver sites, temas, projetos e aplicativos de código não aberto, a licença Comercial é a licença apropriada. Com esta opção, seu código-fonte é mantido proprietário. O que significa que você não precisará alterar todo o código-fonte do aplicativo para uma licença de código aberto. [Comprar uma licença comercial do Fullpage](https://alvarotrigo.com/fullPage/pricing/)\n\n### Licença Open source\nSe você estiver criando um aplicativo de código aberto sob uma licença compatível com a [licença GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html), poderá usar o fullPage sob os termos da GPLv3 .\n\n**Você terá que fornecer um aviso proeminente de que fullPage.js está em uso. Os comentários de crédito nos arquivos JavaScript e CSS devem ser mantidos intactos** (mesmo após combinação ou minificação).\n\n[Leia mais sobre a licença do fullPage](https://alvarotrigo.com/fullPage/pricing/).\n\n## Uso\nComo você pode ver nos arquivos de exemplo, você precisará incluir:\n  - O arquivo JavaScript `fullpage.js` (ou sua versão minificada `fullpage.min.js`)\n  - O arquivo css `fullpage.css`\n\n**Opcionalmente**, ao usar `css3:false`, você pode adicionar o [arquivo easings](https://github.com/alvarotrigo/fullPage.js/tree/master/vendors/easings.min.js) em caso você queira usar outros efeitos de atenuação além do incluído na biblioteca (`easeInOutCubic`).\n\n### Instalar usando bower ou npm\n**Opcionalmente**, você pode instalar fullPage.js com bower ou npm se preferir:\n\nTerminal:\n```shell\n// Com bower\nbower install fullpage.js\n\n// Com npm\nnpm install fullpage.js\n```\n\n### Incluindo arquivos:\n```html\n<link rel=\"stylesheet\" type=\"text/css\" href=\"fullpage.css\" />\n\n<!-- Esta linha a seguir é opcional. Necessário apenas se você usar a opção css3:false e quiser usar outros efeitos de atenuação em vez de \"easeInOutCubic\". -->\n<script src=\"vendors/easings.min.js\"></script>\n\n<script type=\"text/javascript\" src=\"fullpage.js\"></script>\n```\n\nUsando Webpack, Browserify ou Require.js? Confira [como usar fullPage.js com module loaders](https://github.com/alvarotrigo/fullPage.js/wiki/Use-module-loaders-for-fullPage.js).\n\n### Uso opcional de CDN\nSe você preferir usar um CDN para carregar os arquivos necessários, fullPage.js está em [JSDelivr](https://www.jsdelivr.com/package/npm/fullpage.js), [UNPKG](https://unpkg.com/browse/fullpage.js/dist/), [CDNJS](https://cdnjs.com/libraries/fullPage.js)...\n\n### Estrutura HTML necessária\nInicie seu documento HTML com a [declaração HTML DOCTYPE](https://www.corelangs.com/html/introduction/doctype.html) obrigatória na primeira linha do seu código HTML. Caso contrário, você pode ter problemas com as alturas das seções. Os exemplos fornecidos usam o tipo de documento HTML5 `<!DOCTYPE html>`.\n\nCada seção será definida com um elemento contendo a classe `section`.\nA seção ativa por padrão será a primeira seção, que é considerada a página inicial.\n\nAs seções devem ser colocadas dentro de um wrapper (`<div id=\"fullpage\">` neste caso). O wrapper não pode ser o elemento `body`.\n\n```html\n<div id=\"fullpage\">\n\t<div class=\"section\">Alguma seção</div>\n\t<div class=\"section\">Alguma seção</div>\n\t<div class=\"section\">Alguma seção</div>\n\t<div class=\"section\">Alguma seção</div>\n</div>\n```\n\nSe você quiser definir um ponto de partida diferente em vez da primeira seção ou do primeiro slide de uma seção, basta adicionar a classe `active` à seção e ao slide que deseja carregar primeiro.\n\n```html\n<div class=\"section active\">Alguma seção</div>\n```\n\nPara criar um controle deslizante de paisagem dentro de uma seção, cada slide será definido por padrão com um elemento contendo a classe `slide`:\n\n```html\n<div class=\"section\">\n\t<div class=\"slide\"> Slide 1 </div>\n\t<div class=\"slide\"> Slide 2 </div>\n\t<div class=\"slide\"> Slide 3 </div>\n\t<div class=\"slide\"> Slide 4 </div>\n</div>\n```\n\nVocê pode ver um exemplo totalmente funcional da estrutura HTML no arquivo [`simple.html`](https://github.com/alvarotrigo/fullPage.js/blob/master/examples/simple.html).\n\n### Inicialização\n\n#### Inicialização com Vanilla Javascript\nTudo que você precisa fazer é chamar fullPage.js antes da tag de fechamento `</body>`.\n\n```javascript\nnew fullpage('#fullpage', {\n\t//opções aqui\n\tautoScrolling:true,\n\tscrollHorizontally: true\n});\n```\n\n#### Inicialização com jQuery\nVocê pode usar fullpage.js como um plugin do jQuery se quiser!\n\n```javascript\n$(document).ready(function() {\n\t$('#fullpage').fullpage({\n\t\t//Opções aqui\n\t\tautoScrolling:true,\n\t\tscrollHorizontally: true\n\t});\n\n\t// Example of how to use fullpage.js methods\n\t$.fn.fullpage.setAllowScrolling(false);\n});\n```\n\n#### Exemplo de Vanilla JS com todas as opções\nUma inicialização mais complexa com todas as opções definidas pode ser assim:\n\n```javascript\n\nvar myFullpage = new fullpage('#fullpage', {\n\t// Navegação\n\tmenu: '#menu',\n\tlockAnchors: false,\n\tanchors:['firstPage', 'secondPage'],\n\tnavigation: false,\n\tnavigationPosition: 'right',\n\tnavigationTooltips: ['firstSlide', 'secondSlide'],\n\tshowActiveTooltip: false,\n\tslidesNavigation: false,\n\tslidesNavPosition: 'bottom',\n\n\t// Rolagem\n\tcss3: true,\n\tscrollingSpeed: 700,\n\tautoScrolling: true,\n\tfitToSection: true,\n\tfitToSectionDelay: 600,\n\tscrollBar: false,\n\teasing: 'easeInOutCubic',\n\teasingcss3: 'ease',\n\tloopBottom: false,\n\tloopTop: false,\n\tloopHorizontal: true,\n\tcontinuousVertical: false,\n\tcontinuousHorizontal: false,\n\tscrollHorizontally: false,\n\tinterlockedSlides: false,\n\tdragAndMove: false,\n\toffsetSections: false,\n\tresetSliders: false,\n\tfadingEffect: false,\n\tnormalScrollElements: '#element1, .element2',\n\tscrollOverflow: true,\n\tscrollOverflowMacStyle: false,\n\tscrollOverflowReset: false,\n\ttouchSensitivity: 15,\n\tbigSectionsDestination: null,\n\tadjustOnNavChange: true,\n\n\t// Acessibilidade\n\tkeyboardScrolling: true,\n\tanimateAnchor: true,\n\trecordHistory: true,\n\n\t// Design\n\tcontrolArrows: true,\n\tcontrolArrowsHTML: [\n\t\t'<div class=\"fp-arrow\"></div>', \n\t\t'<div class=\"fp-arrow\"></div>'\n\t],\n\tverticalCentered: true,\n\tsectionsColor : ['#ccc', '#fff'],\n\tpaddingTop: '3em',\n\tpaddingBottom: '10px',\n\tfixedElements: '#header, .footer',\n\tresponsiveWidth: 0,\n\tresponsiveHeight: 0,\n\tresponsiveSlides: false,\n\tcinematic: false,\n\tcinematicOptions: [Object],\n\teffects: false,\n\teffectsOptions: [Object],\n\tparallax: false,\n\tparallaxOptions: {type: 'reveal', percentage: 62, property: 'translate'},\n\tdropEffect: false,\n\tdropEffectOptions: { speed: 2300, color: '#F82F4D', zIndex: 9999},\n\twaterEffect: false,\n\twaterEffectOptions: { animateContent: true, animateOnMouseMove: true},\n\tcards: false,\n\tcardsOptions: {perspective: 100, fadeContent: true, fadeBackground: true},\n\n\t// Seletores customizados\n\tsectionSelector: '.section',\n\tslideSelector: '.slide',\n\n\tlazyLoading: true,\n\tlazyLoadThreshold: 0,\n\tobserver: true,\n\tcredits: { enabled: true, label: 'Made with fullPage.js', position: 'right'},\n\n\t// Evento\n\tbeforeLeave: function(origin, destination, direction, trigger){},\n\tonLeave: function(origin, destination, direction, trigger){},\n\tafterLoad: function(origin, destination, direction, trigger){},\n\tafterRender: function(){},\n\tafterResize: function(width, height){},\n\tafterReBuild: function(){},\n\tafterResponsive: function(isResponsive){},\n\tafterSlideLoad: function(section, origin, destination, direction, trigger){},\n\tonSlideLeave: function(section, origin, destination, direction, trigger){},\n\tonScrollOverflow: function(section, slide, position, direction){}\n});\n```\n\n### Criando links para seções ou slides\nSe você estiver usando fullPage.js com links âncora para as seções (usando a opção `anchors` ou o atributo `data-anchor` em cada seção), poderá usar links âncora também para navegar diretamente para um determinado slide dentro de uma seção.\n\nEste seria um exemplo de um link com uma âncora: https://alvarotrigo.com/fullPage/#secondPage/2 (que é a URL que você verá quando acessar essa seção/slide manualmente)\nObserve que a última parte da URL termina em `#secondPage/2`.\n\nTendo a seguinte inicialização:\n\n```javascript\nnew fullpage('#fullpage', {\n\tanchors:['firstPage', 'secondPage', 'thirdPage']\n});\n```\n\nA âncora no final da URL `#secondPage/2` define a seção e o slide de destino, respectivamente. Na URL anterior, a seção de destino será aquela definida com a âncora `secondPage` e o slide será o 2º slide, pois estamos usando o índice `2` para isso. (o primeiro slide de uma seção tem índice 0, pois tecnicamente é uma seção).\n\nPoderíamos ter usado uma âncora personalizada para o slide em vez de seu índice se tivéssemos usado o atributo `data-anchor` na marcação HTML assim:\n\n```html\n<div class=\"section\">\n\t<div class=\"slide\" data-anchor=\"slide1\"> Slide 1 </div>\n\t<div class=\"slide\" data-anchor=\"slide2\"> Slide 2 </div>\n\t<div class=\"slide\" data-anchor=\"slide3\"> Slide 3 </div>\n\t<div class=\"slide\" data-anchor=\"slide4\"> Slide 4 </div>\n</div>\n```\nNeste último caso, a URL que usaríamos seria `#secondPage/slide3`, que é equivalente à nossa anterior `#secondPage/2`.\n\nObserve que as âncoras de seção também podem ser definidas da mesma maneira, usando o atributo `data-anchor`, se nenhum array `anchors` for fornecido.\n\n**Cuidado!** As tags `data-anchor` não podem ter o mesmo valor que qualquer elemento de ID no site (ou elemento NAME para IE).\n\n### Criando seções maiores ou menores\n[Demonstração](https://codepen.io/alvarotrigo/pen/BKjRYm) fullPage.js fornece uma maneira de remover a restrição de altura total de suas seções e slides. É possível criar seções cuja altura seja menor ou maior que a viewport. Isso é ideal para rodapés.\nÉ importante perceber que não faz sentido ter todas as suas seções usando esse recurso. Se houver mais de uma seção no carregamento inicial do site, fullPage.js não rolará para ver a próxima, pois ela já estará na janela de visualização.\n\nPara criar seções menores, basta usar a classe `fp-auto-height` na seção que você deseja aplicá-la. Em seguida, ele terá a altura definida pelo conteúdo da sua seção/slide.\n\n```html\n<div class=\"section\">Viewport completa</div>\n<div class=\"section fp-auto-height\">Altura automática</div>\n```\n\n#### Seções de altura responsiva\n[Demonstração](https://codepen.io/alvarotrigo/pen/MzByMa) Uma altura automática responsiva pode ser aplicada usando a classe `fp-auto-height-responsive`. Dessa forma, as seções ficarão em tela cheia até que o modo responsivo seja acionado. Em seguida, eles terão o tamanho exigido pelo conteúdo, que pode ser maior ou menor que a janela de visualização.\n\n### Classes de estado adicionadas pelo fullPage.js\nFullpage.js adiciona várias classes em diferentes elementos para manter um registro do status do site:\n\n- `active` é adicionado à seção e slide visíveis atuais.\n- `active` é adicionado ao elemento de menu atual (se estiver usando a opção `menu`).\n- `fp-loaded` é adicionado ao elemento da seção ou slide que aciona o carregamento lento do conteúdo de mídia.\n- Uma classe no formato `fp-viewing-SECTION-SLIDE` é adicionada ao elemento `body` do site. (ex: [`fp-viewing-secondPage-0`](https://alvarotrigo.com/fullPage/#secondPage)) As partes `SECTION` e `SLIDE` serão as âncoras (ou índices se nenhuma âncora for fornecida) da seção e slide atuais.\n- `fp-responsive` é adicionado ao elemento `body` ao entrar no modo responsivo\n- `fp-enabled` é adicionado ao elemento `html` quando fullpage.js está habilitado. (e removido quando destruído).\n- `fp-destroyed` é adicionado ao contêiner fullpage.js quando fullPage.js é destruído.\n\n### Lazy Loading\n[Demonstração](https://codepen.io/alvarotrigo/pen/eNLBXo) fullPage.js fornece uma maneira de carregar imagens, vídeos e elementos de áudio de forma lenta para que eles não retardem o carregamento do seu site ou desperdicem desnecessariamente a transferência de dados.\nAo usar o carregamento lento, todos esses elementos só serão carregados ao entrar na viewport.\nPara habilitar o carregamento lento, tudo o que você precisa fazer é alterar seu atributo `src` para `data-src` como mostrado abaixo:\n\n```html\n<img data-src=\"image.png\">\n<video>\n\t<source data-src=\"video.webm\" type=\"video/webm\" />\n\t<source data-src=\"video.mp4\" type=\"video/mp4\" />\n</video>\n ```\n\nSe você já usa outra solução de carregamento lento que também usa `data-src`, você pode desabilitar o carregamento lento fullPage.js configurando a opção `lazyLoading: false`.\n\n### Reprodução/pausa automática de mídias embutidas\n\n[Demonstração](https://codepen.io/alvarotrigo/pen/pXEaaK) **Observação**: o recurso de reprodução automática pode não funcionar em alguns dispositivos móveis dependendo do sistema operacional e do navegador (ou seja, [Safari no iOS](https://webkit.org/blog/6784/new-video-policies-for-ios/) versão < 10.0).\n\n#### Tocar ao carregar seção/slide:\nUsar o atributo `autoplay` para vídeos ou áudio, ou o parâmetro `autoplay=1` para iframes do youtube resultará na reprodução do elemento de mídia no carregamento da página.\nPara reproduzi-lo no carregamento de seção/slide, use o atributo `data-autoplay`. Por exemplo:\n\n```html\n<audio data-autoplay>\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\n</audio>\n```\n\n#### Pausar ao sair\nOs iframes HTML5 `<vídeo>` / `<áudio>` incorporados e do YouTube são pausados automaticamente quando você sai de uma seção ou slide. Isso pode ser desabilitado usando o atributo `data-keepplaying`. Por exemplo:\n<audio data-keepplaying>\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\n</audio>\n```\n\n### Uso de extensões\nfullpage.js [fornece um conjunto de extensões](https://alvarotrigo.com/fullPage/extensions/br/) que você pode usar para aprimorar seus recursos padrão. Todos eles estão listados como [opções fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#opções).\n\nExtensões requer que você use o arquivo minificado [`fullpage.extensions.min.js`](https://github.com/alvarotrigo/fullPage.js/blob/master/dist/fullpage.extensions.min.js) que é dentro da [pasta `dist`](https://github.com/alvarotrigo/fullPage.js/tree/master/dist) em vez do arquivo fullPage.js usual (`fullpage.js` ou `fullpage.min.js `).\n\nDepois de adquirir o arquivo de extensão, você precisará adicioná-lo antes do fullPage. Por exemplo, se eu quiser usar a extensão Horizontal Contínua, teria que incluir o arquivo de extensão e, em seguida, a versão das extensões do arquivo fullPage.\n\n```html\n<script type=\"text/javascript\" src=\"fullpage.continuousHorizontal.min.js\"></script>\n<script type=\"text/javascript\" src=\"fullpage/fullpage.extensions.min.js\"></script>\n```\n\nUma chave de ativação e uma chave de licença serão necessárias para cada extensão. [Veja mais detalhes sobre isso aqui](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/how-to-activate-fullpage-extension.md).\n\nEntão você poderá usá-los e configurá-los conforme explicado em [Opções](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#opções).\n\n## Opções\n\n### licenseKey:\n(padrão `null`). **Esta opção é obrigatória.** Se você usar o fullPage em um projeto não open source, deverá utilizar a chave de licença fornecida na compra da Licença Comercial do fullPage. Se o seu projeto for open source e for compatível com a licença GPLv3, você pode [solicitar uma chave de licença](https://alvarotrigo.com/fullPage/extensions/requestKey.html). Por favor, leia mais sobre as licenças [aqui](https://github.com/alvarotrigo/fullPage.js#license) e [no site](https://alvarotrigo.com/fullPage/pricing/). Exemplo de uso:\n\n```javascript\nnew fullpage('#fullpage', {\n    licenseKey: 'YOUR_KEY_HERE'\n});\n```\n\n### controlArrows:\n(padrão `true`) Determina se as setas de controle devem ser usadas para mover os slides para a direita ou para a esquerda.\n\n### controlArrowsHTML:\n(padrão `['<div class=\"fp-arrow\"></div>', '<div class=\"fp-arrow\"></div>'],`). Fornece uma maneira de definir a estrutura HTML e as classes que você deseja aplicar às setas de controle para seções com slides horizontais. A matriz contém a estrutura para ambas as setas. O primeiro item é a seta para a esquerda e o segundo, a seta para a direita.\n\n### verticalCentered:\n(padrão `true`) Centralização vertical do conteúdo usando flexbox. Você pode querer envolver seu conteúdo em um `div` para evitar possíveis problemas. (Usa `flex-direction: column; display: flex; justify-content: center;`)\n\n### scrollingSpeed:\n(padrão `700`) Velocidade em milissegundos para as transições de rolagem.\n\n### sectionsColor:\n(padrão `none`) Defina a propriedade CSS `background-color` para cada seção.\nExample:\n```javascript\nnew fullpage('#fullpage', {\n\tsectionsColor: ['#f2f2f2', '#4BBFC3', '#7BAABE', 'whitesmoke', '#000'],\n});\n```\n\n### anchors:\n(padrão `[]`) Define os links âncora (#example) a serem mostrados na URL de cada seção. O valor das âncoras deve ser único. A posição das âncoras na matriz definirá em quais seções a âncora será aplicada. (segunda posição para a segunda seção e assim por diante). O uso de âncoras de navegação para frente e para trás também será possível através do navegador. Essa opção também permite que os usuários marquem uma seção ou slide específico. **Cuidado!** âncoras não podem ter o mesmo valor que qualquer elemento de ID no site (ou elemento NAME para IE).\nAgora as âncoras podem ser definidas diretamente na estrutura HTML usando o atributo `data-anchor` conforme explicado aqui.\n\n### lockAnchors:\n(padrão `false`) Determina se as âncoras na URL terão algum efeito na biblioteca. Você ainda pode usar âncoras internamente para suas próprias funções e retornos de chamada, mas elas não terão nenhum efeito na rolagem do site. Útil se você quiser combinar fullPage.js com outros plugins usando âncora na URL.\n\n**Importante** É útil entender que os valores no array de opções `anchors` se correlacionam diretamente com o elemento com a classe `.section` por sua posição na marcação.\n\n### easing:\n(padrão `easeInOutCubic`) Define o efeito de transição a ser usado para a rolagem vertical e horizontal.\nRequer o arquivo `vendors/easings.min.js` ou [jQuery UI](https://jqueryui.com/) para usar algumas de [suas transições](https://api.jqueryui.com/easings/) . Outras bibliotecas podem ser usadas em vez disso.\n\n### easingcss3:\n(padrão `ease`) Define o efeito de transição a ser usado no caso de usar `css3:true`. Você pode usar os [predefinidos](https://www.w3schools.com/cssref/css3_pr_transition-timing-function.asp) (como `linear`, `ease-out`...) ou criar seu próprios usando a função `cubic-bezier`. Você pode querer usar [Matthew Lein CSS Easing Animation Tool](https://matthewlein.com/ceaser/) para isso.\n\n### loopTop:\n(padrão `false`) Define se a rolagem para cima na primeira seção deve rolar para a última ou não.\n\n### loopBottom:\n(padrão `false`) Define se a rolagem para baixo na última seção deve rolar para a primeira ou não.\n\n### loopHorizontal`:\n (padrão `true`) Define se os controles deslizantes horizontais farão um loop após alcançar o último slide ou o anterior ou não.\n\n### css3`:\n (padrão `true`). Define se as transformações JavaScript ou CSS3 devem ser usadas para rolar nas seções e slides. Útil para acelerar o movimento em tablets e dispositivos móveis com navegadores que suportem CSS3. Se esta opção estiver definida como `true` e o navegador não suportar CSS3, um substituto será usado.\n\n### autoScrolling:\n(padrão `true`) Define se deve ser usada a rolagem \"automática\" ou a \"normal\". Também afeta a maneira como as seções se encaixam na janela do navegador/dispositivo em tablets e telefones celulares.\n\n### fitToSection:\n(padrão `true`) Determina se as seções devem ou não ser ajustadas à viewport. Quando definido como `true`, a seção ativa atual sempre preencherá toda a janela de visualização. Caso contrário, o usuário estará livre para parar no meio de uma seção.\n\n### fitToSectionDelay:\n(default 1000). If `fitToSection` is set to true, this delays\nthe fitting by the configured milliseconds.\n\n### scrollBar:\n(padrão `false`) Determina se a barra de rolagem deve ser usada para as **seções verticais** no site ou não. No caso de usar a barra de rolagem, a funcionalidade `autoScrolling` ainda funcionará conforme o esperado. O usuário também estará livre para rolar o site com a barra de rolagem e fullPage.js caberá na seção na tela quando a rolagem terminar.\n\n### paddingTop:\n(padrão `0`) Define o preenchimento superior para cada seção com um valor numérico e sua medida (paddingTop: '10px', paddingTop: '10em'...) Útil no caso de usar um cabeçalho fixo.\n\n### paddingBottom:\n(padrão `0`) Define o preenchimento inferior de cada seção com um valor numérico e sua medida (paddingBottom: '10px', paddingBottom: '10em'...). Útil no caso de usar um rodapé fixo.\n\n### fixedElements:\n(padrão `null`) Define quais elementos serão retirados da estrutura de rolagem do plugin que é necessário ao usar a opção `css3` para mantê-los fixos. Requer uma string com os seletores Javascript para esses elementos. (Por exemplo: `fixedElements: '#element1, .element2'`)\n\n### normalScrollElements:\n(padrão `null`) [Demonstração](https://codepen.io/alvarotrigo/pen/RmVazM) Se você quiser evitar a rolagem automática ao rolar sobre alguns elementos, esta é a opção que você precisa usar. (útil para mapas, divs de rolagem etc.) Requer uma string com os seletores Javascript para esses elementos. (Por exemplo: `normalScrollElements: '#element1, .element2'`). Esta opção não deve ser aplicada a nenhum elemento de seção/slide.\n\n### bigSectionsDestination:\n(padrão `null`) [Demonstração](https://codepen.io/alvarotrigo/pen/vYLdMrx) Define como rolar para uma seção cuja altura é maior que a viewport e quando não estiver usando `scrollOverflow: verdadeiro`. (Leia [como criar seções menores ou maiores](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#criando-seções-maiores-ou-menores)). Por padrão, fullPage.js rola para o topo se você vier de uma seção acima do destino e para baixo se você vier de uma seção abaixo do destino. Os valores possíveis são `top`, `bottom`, `null`.\n\n### adjustOnNavChange\n(padrão `true`)\nDefine se o fullPage.js ajusta a altura das seções quando a barra de navegação ou a barra de endereço no celular muda de tamanho ou alterna sua visibilidade. Se definido como false, as seções não aparecerão com altura total quando a barra de navegação encolher ou desaparecer.\n\n### keyboardScrolling:\n(padrão `true`) Define se o conteúdo pode ser navegado usando o teclado.\n\n### touchSensitivity:\n(padrão `5`) Define uma porcentagem da largura/altura da janela do navegador e a distância que um deslize deve medir para navegar para a próxima seção/slide\n\n### skipIntermediateItems\n(padrão `false`). Determina se a animação de rolagem deve ser ignorada ao navegar entre seções verticais ou slides horizontais não consecutivos. Os valores possíveis são `true`, `false`, `sections` e `slides`, permitindo aplicar esse comportamento verticalmente, horizontalmente ou em ambas as direções.\n\n### continuousVertical:\n(padrão `false`) Define se a rolagem para baixo na última seção deve rolar para a primeira e se a rolagem para cima na primeira seção deve rolar para a última. Não compatível com `loopTop`, `loopBottom` ou qualquer barra de rolagem presente no site (`scrollBar:true` ou `autoScrolling:false`).\n\n### continuousHorizontal:\n(padrão `false`) [Extensão de fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/). Define se deslizar para a direita no último slide deve deslizar para a direita para o primeiro ou não, e se rolar para a esquerda no primeiro slide deve deslizar para a esquerda para o último ou não. Não compatível com `loopHorizontal`. Requer fullpage.js >= 3.0.1.\n\n### scrollHorizontally:\n(padrão `false`) [Extensão de fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/). Define se desliza horizontalmente nos controles deslizantes usando a roda do mouse ou o trackpad. Ele só pode ser usado ao usar: `autoScrolling:true`. Ideal para contar histórias. Requer fullpage.js >= 3.0.1.\n\n### interlockedSlides:\n(padrão `false`) [Extensão de fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/). Determina se mover um controle deslizante horizontal forçará o deslizamento dos controles deslizantes em outra seção na mesma direção. Os valores possíveis são `true`, `false` ou uma matriz com as seções interligadas. Por exemplo, `[1,3,5]` começando por 1. Requer fullpage.js >= 3.0.1.\n\n### dragAndMove:\n(padrão `false`) [Extensão de fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/). Ativa ou desativa o arrastar e deslizar de seções e slides usando o mouse ou os dedos. Requer fullpage.js >= 3.0.1. Os valores possíveis são:\n  - `true`: habilita o recurso.\n  - `false`: desativa o recurso.\n  - `vertical`: habilita o recurso apenas verticalmente.\n  - `horizontal`: habilita o recurso apenas horizontalmente.\n  - `fingersonly`: habilita o recurso apenas para dispositivos de toque.\n  - `mouseonly`: habilita o recurso apenas para dispositivos desktop (mouse e trackpad).\n\n### offsetSections\n(padrão `false`)[Extensão de fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/). Fornece uma maneira de usar seções que não sejam de tela cheia com base na porcentagem. Ideal para mostrar aos visitantes que há mais conteúdo no site, mostrando parte da seção seguinte ou anterior. Requer fullPage.js >= 3.0.1.\nPara definir a porcentagem de cada seção deve-se usar o atributo `data-percentage`. A centralização da seção na janela de visualização pode ser determinada usando um valor booleano no atributo `data-centered` (o padrão é `true` se não for especificado). Por exemplo:\n``` html\n    <div class=\"section\" data-percentage=\"80\" data-centered=\"true\">\n```\n\n### resetSliders\n(padrão `false`). [Extensão de fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/). Define se deve ou não redefinir cada controle deslizante após sair de sua seção. Requer fullpage.js >= 3.0.1.\n\n### fadingEffect\n(padrão `false`). [Extensão de fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/). Define se deve usar um efeito de desvanecimento ou não em vez do efeito de rolagem padrão. Os valores possíveis são `true`, `false`, `sections`, `slides`. Portanto, pode ser aplicado apenas verticalmente ou horizontalmente, ou em ambos ao mesmo tempo. Ele só pode ser usado ao usar: `autoScrolling:true`. Requer fullpage.js >= 3.0.1.\n\n### animateAnchor\n(padrão `true`) Define se o carregamento do site quando dado uma âncora (#) rolará com a animação até seu destino ou será carregado diretamente na seção dada.\n\n### recordHistory\n(padrão `true`) Define se o estado do site deve ser enviado para o histórico do navegador. Quando definido como \"true\", cada seção/slide do site funcionará como uma nova página e os botões voltar e avançar do navegador rolarão as seções/slides para alcançar o estado anterior ou seguinte do site. Quando definido como `false`, o URL continuará mudando, mas não terá efeito no histórico do navegador. Esta opção é desativada automaticamente ao usar `autoScrolling:false`.\n\n### menu\n(padrão `false`) Um seletor pode ser usado para especificar o menu a ser vinculado às seções. Desta forma, a rolagem das seções ativará o elemento correspondente no menu usando a classe `active`.\nIsso não gerará um menu, mas apenas adicionará a classe `active` ao elemento no menu fornecido com os links âncora correspondentes.\nPara vincular os elementos do menu com as seções, será necessária uma tag de dados HTML 5 (`data-menuanchor`) para usar com os mesmos links âncora usados nas seções. Exemplo:\n\n```html\n<ul id=\"myMenu\">\n\t<li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">Primeira section</a></li>\n\t<li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Segunda section</a></li>\n\t<li data-menuanchor=\"thirdPage\"><a href=\"#thirdPage\">Terceira section</a></li>\n\t<li data-menuanchor=\"fourthPage\"><a href=\"#fourthPage\">Quarta section</a></li>\n</ul>\n```\n```javascript\nnew fullpage('#fullpage', {\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\n\tmenu: '#myMenu'\n});\n```\n\n**Observação:** o elemento de menu deve ser colocado fora do wrapper de página inteira para evitar problemas ao usar `css3:true`. Caso contrário, ele será anexado ao `body` pelo próprio plugin.\n\n### navigation\n(padrão `false`) Se definido como `true`, mostrará uma barra de navegação composta por pequenos círculos.\n\n### navigationPosition\n(padrão `none`) Pode ser definido como `left` ou `right` e define em qual posição a barra de navegação será mostrada (se estiver usando uma).\n\n### navigationTooltips\n(padrão []) Define as dicas de ferramentas a serem exibidas para os círculos de navegação caso estejam sendo usadas. Exemplo: `navigationTooltips: ['firstSlide', 'secondSlide']`. Você também pode defini-los usando o atributo `data-tooltip` em cada seção, se preferir.\n\n### showActiveTooltip\n(padrão `false`) Mostra uma dica de ferramenta persistente para a seção visualizada ativamente na navegação vertical.\n\n### slidesNavigation\n(padrão `false`) Se definido como `true`, mostrará uma barra de navegação composta de pequenos círculos para cada controle deslizante de paisagem no site.\n\n### slidesNavPosition\n(padrão `bottom`) Define a posição da barra de navegação de paisagem para controles deslizantes. Admite `top` e `bottom` como valores. Você pode querer modificar os estilos CSS para determinar a distância da parte superior ou inferior, bem como qualquer outro estilo, como cor.\n\n### scrollOverflow\n(padrão `true`) define se deve ou não criar um scroll para a seção/slide caso seu conteúdo seja maior que a altura do mesmo. It requires the default value `scrollBar: false`. Para evitar que fullpage.js crie a barra de rolagem em certas seções ou slides, use a classe `fp-noscroll`. Por exemplo: `<div class=\"section fp-noscroll\">` Você também pode impedir que o scrolloverflow seja aplicado no modo responsivo ao usar `fp-auto-height-responsive` no elemento section.\n\n### scrollOverflowReset\n(padrão `false`) [Extensão de fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/). Os valores possíveis são `true`, `false`, `sections`, `slides`. Quando definido como `true`, ele rola o conteúdo da seção/slide com uma barra de rolagem ao sair para outra seção/slide. Dessa forma, a seção/slide sempre mostrará o início de seu conteúdo, mesmo ao rolar de uma seção abaixo dela. Adicionar a classe `fp-no-scrollOverflowReset` na seção ou slide desativará esse recurso para esse painel específico.\n\n### scrollOverflowMacStyle\n(padrão `false`). Quando ativa, esta opção usará um \"estilo mac\" para a barra de rolagem em vez do padrão, que será bem diferente em computadores Windows.\n\n### sectionSelector\n(padrão `.section`) Define o seletor Javascript usado para as seções do plugin. Ele pode precisar ser alterado algumas vezes para evitar problemas com outros plugins usando os mesmos seletores que fullpage.js.\n\n### slideSelector\n(padrão `.slide`) Define o seletor Javascript usado para os slides do plugin. Ele pode precisar ser alterado algumas vezes para evitar problemas com outros plugins usando os mesmos seletores que fullpage.js.\n\n### responsiveWidth\n(padrão `0`) Uma rolagem normal (`autoScrolling:false`) será usada sob a largura definida em pixels. Uma classe `fp-responsive` é adicionada à tag body caso o usuário queira usá-la para seu próprio CSS responsivo. Por exemplo, se definido como 900, sempre que a largura do navegador for menor que 900, o plug-in rolará como um site normal.\n\n### responsiveHeight\n(padrão `0`) Um scroll normal (`autoScrolling:false`) será usado sob a altura definida em pixels. Uma classe `fp-responsive` é adicionada à tag body caso o usuário queira usá-la para seu próprio CSS responsivo. Por exemplo, se definido como 900, sempre que a altura do navegador for menor que 900, o plug-in rolará como um site normal.\n\n### responsiveSlides\n(padrão `false`) [Extensão de fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/). Quando definido como \"true\", os slides serão transformados em seções verticais quando o modo responsivo for acionado. (usando as opções `responsiveWidth` ou `responsiveHeight` detalhadas acima). Requer fullpage.js >= 3.0.1.\n\n### cinematic\n\n(padrão `false`) [Extensão do fullpage.js](https://alvarotrigo.com/fullPage/extensions/cinematic.html). Ativa ou desativa os efeitos de slider nas seções. Requer fullpage.js >= 4.0.41.\n\n### cinematicOptions\n\n(padrão: `{Object}`) Permite configurar os parâmetros de animação do conteúdo ao utilizar a opção `cinematic:true`. [Leia mais](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cinematic-Effects#cinematicoptions).\n\n### effects\n(padrão: `false`) [Extensão do fullpage.js](https://alvarotrigo.com/fullPage/extensions/slider-effects.html). Ativa ou desativa os efeitos de slider nas seções. Requer fullpage.js >= 4.0.35\n\n### effectsOptions\n(padrão: `{Object}`, configuração para o preset [\"focus\"](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#20-available-presetss)).  \nPermite configurar os parâmetros dos efeitos ao usar a opção `effects:true`. [Saiba mais sobre como aplicar a opção effects](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#effects-options-documentation)\n\n### parallax\n(padrão `false`) [Extensão de fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/). Define se deve ou não usar os efeitos de fundo de paralaxe em seções/slides. [Leia mais sobre como aplicar a opção de paralaxe](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax).\n\n### parallaxOptions\n(padrão: `{ type: 'reveal', percentage: 62, property: 'translate'}`). \nPermite configurar os parâmetros para o efeito de fundo de paralaxe ao usar a opção `parallax:true`. [Leia mais sobre como aplicar a opção de paralaxe](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax).\n\n### dropEffect\n(padrão `false`) [Extensão de fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/). Define se deve ou não usar o efeito de soltar nas seções/slides. [Leia mais sobre como aplicar a opção de efeito de soltar](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect).\n\n### dropEffectOptions\n(padrão: `{ speed: 2300, color: '#F82F4D', zindex: 9999}`). \nPermite configurar os parâmetros para o efeito de soltar ao usar a opção `dropEffect:true`.[Leia mais sobre como aplicar a opção de efeito de soltar](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect).\n\n### waterEffect\n(padrão `false`) [Extensão de fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/). Define se deve ou não usar o efeito água nas seções/slides. [Leia mais sobre como aplicar a opção de efeito de água](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect).\n\n### waterEffectOptions\n(padrão: `{ animateContent: true, animateOnMouseMove: true}`). \nPermite configurar os parâmetros para o efeito água ao usar a opção `waterEffect:true`.[Leia mais sobre como aplicar a opção efeito água](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect).\n\n### cards\n(default `false`) [Extensões do fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/). Defines whether or not to use the cards effect on sections/slides. [Read more about how to apply the cards option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards).\n\n### cardsOptions\n(default: `{ perspective: 100, fadeContent: true, fadeBackground: true}`). \nAllows you to configure the parameters for the cards effect when using the option `cards:true`. [Read more about how to apply the cards option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards).\n\n### lazyLoading\n(padrão `true`) O carregamento lento está ativo por padrão, o que significa que carregará lentamente qualquer elemento de mídia contendo o atributo `data-src` conforme detalhado nos [documentos de carregamento lento](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#lazy-loading). Se você quiser usar qualquer outra biblioteca de carregamento lento, você pode desativar esse recurso fullpage.js.\n\n### lazyLoadThreshold\n(padrão `0`) Especifica o número de seções verticais adjacentes e slides horizontais cujos elementos de mídia devem ser carregados de forma preguiçosa em relação ao atual. Use um número para especificar quantas seções ou slides anteriores e seguintes devem ser pré-carregados\n\n### observer\n(padrão `true`) Define se deve ou não observar mudanças na estrutura HTML da página. Quando ativado, fullPage.js reagirá automaticamente a essas alterações e se atualizará de acordo. Ideal ao adicionar, remover ou ocultar seções ou slides.\n\n### credits\n(padrão `{enabled: true, label: 'Made with fullpage.js', position: 'right'}`). \nDefine se os créditos fullPage.js devem ser usados. De acordo com as cláusulas 0, 4, 5 e 7 da licença GPLv3, aqueles que usam fullPage.js sob a GPLv3 são obrigados a fornecer um aviso proeminente de que fullPage.js está em uso. Recomendamos incluir a atribuição mantendo essa opção ativada. **Nota:** Esta opção requer um valor válido para `licenseKey`.\n\n## Métodos\nVocê pode vê-los em ação [aqui](https://alvarotrigo.com/fullPage/examples/methods.html)\n\n### getActiveSection()\n[Demonstração](https://codepen.io/alvarotrigo/pen/VdpzRN/) Obtém um objeto (tipo [Section](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#callbacks)) contendo a seção ativa e suas propriedades.\n\n```javascript\nfullpage_api.getActiveSection();\n```\n\n### getActiveSlide()\n[Demonstração](https://codepen.io/alvarotrigo/pen/VdpzRN/) Obtém um objeto (tipo [Slide](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#callbacks)) contendo o slide ativo e suas propriedades.\n\n```javascript\nfullpage_api.getActiveSlide();\n```\n\n### getScrollY() & getScrollX\n[Demonstração](https://codepen.io/alvarotrigo/pen/GRyGqro) `getScrollY` Obtém a posição Y do wrapper fullPage. `getScrollX` obtém a posição X do slide horizontal ativo.\n\n```javascript\nfullpage_api.getScrollY();\nfullpage_api.getScrollX();\n```\n\n### moveSectionUp()\n[Demonstração](https://codepen.io/alvarotrigo/pen/GJXNMN) Rola uma seção para cima:\n```javascript\nfullpage_api.moveSectionUp();\n```\n---\n### moveSectionDown()\n[Demonstração](https://codepen.io/alvarotrigo/pen/jPvVZx) Rola uma seção para baixo:\n```javascript\nfullpage_api.moveSectionDown();\n```\n---\n### moveTo(section, slide)\n[Demonstração](https://codepen.io/alvarotrigo/pen/doqOmY) Rola a página até a seção e o slide fornecidos. A primeira seção terá o índice 1 enquanto o primeiro slide, o visível por padrão, terá o índice 0.\n```javascript\n/*Rolando para a seção com o link âncora `firstSlide` e para o 2º Slide */\nfullpage_api.moveTo('firstSlide', 2);\n\n```\n\n```javascript\n//Rolando para a 3ª seção (com índice 3) no site\nfullpage_api.moveTo(3, 0);\n\n//Que é o mesmo que\nfullpage_api.moveTo(3);\n```\n---\n### silentMoveTo(section, slide)\n[Demonstração](https://codepen.io/alvarotrigo/pen/doqOeY)\nExatamente igual ao [`moveTo`](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#movetosection-slide) mas neste caso ele realiza o scroll sem animação. Um salto direto para o destino.\n```javascript\n/*Rolando para a seção com o link âncora `firstSlide` e para o 2º Slide */\nfullpage_api.silentMoveTo('firstSlide', 2);\n```\n---\n### moveSlideRight()\n[Demonstração](https://codepen.io/alvarotrigo/pen/Wvgoyz)\nRola o controle deslizante horizontal da seção atual para o próximo slide:\n```javascript\nfullpage_api.moveSlideRight();\n```\n---\n### moveSlideLeft()\n[Demonstração](https://codepen.io/alvarotrigo/pen/gpdLjW)\nRola o controle deslizante horizontal da seção atual para o slide anterior:\n```javascript\nfullpage_api.moveSlideLeft();\n```\n---\n### setAutoScrolling(boolean)\n[Demonstração](https://codepen.io/alvarotrigo/pen/rVZWrR) Define a configuração de rolagem em tempo real.\nDefine a forma como a rolagem da página se comporta. Se estiver definido como `true`, usará a rolagem \"automática\", caso contrário, usará a rolagem \"manual\" ou \"normal\" do site.\n\n```javascript\nfullpage_api.setAutoScrolling(false);\n```\n---\n### setFitToSection(boolean)\n[Demonstração](https://codepen.io/alvarotrigo/pen/GJXNYm)\nDefine o valor para a opção `fitToSection` determinando se cabe ou não a seção na tela.\n\n```javascript\nfullpage_api.setFitToSection(false);\n```\n---\n### fitToSection()\n[Demonstração](https://codepen.io/alvarotrigo/pen/JWWagj)\nRola para a seção ativa mais próxima, ajustando-a na viewport.\n\n```javascript\nfullpage_api.fitToSection();\n```\n---\n### setLockAnchors(boolean)\n[Demonstração](https://codepen.io/alvarotrigo/pen/yNxVRQ)\nDefine o valor para a opção `lockAnchors` determinando se as âncoras terão algum efeito na URL ou não.\n\n```javascript\nfullpage_api.setLockAnchors(false);\n```\n---\n### setAllowScrolling(boolean, [directions])\n[Demonstração](https://codepen.io/alvarotrigo/pen/EjeNdq) Adiciona ou remove a possibilidade de rolar pelas seções/slides usando a roda do mouse/trackpad ou gestos de toque (que está ativo por padrão). Observe que isso não desativará a rolagem do teclado. Você precisaria usar `setKeyboardScrolling` para isso.\n\n- `directions`: (parâmetro opcional) Valores admitidos: `all`, `up`, `down`, `left`, `right` ou uma combinação deles separados por vírgulas como `down, right`. Define a direção para a qual a rolagem será habilitada ou desabilitada.\n\n```javascript\n\n//desabilitando rolagem\nfullpage_api.setAllowScrolling(false);\n\n//desabilitando rolagem para baixo\nfullpage_api.setAllowScrolling(false, 'down');\n\n//desabilitando rolagem para baixo e direita\nfullpage_api.setAllowScrolling(false, 'down, right');\n```\n---\n### setKeyboardScrolling(boolean, [directions])\n[Demonstração](https://codepen.io/alvarotrigo/pen/GJXNwm) Adiciona ou remove a possibilidade de rolar pelas seções usando o teclado (que está ativo por padrão).\n\n- `directions`: (parâmetro opcional) Valores admitidos: `all`, `up`, `down`, `left`, `right` ou uma combinação deles separados por vírgulas como `down, right`. Ele define a direção para a qual a rolagem será habilitada ou desabilitada.\n\n```javascript\n//desabilitando toda a rolagem do teclado\nfullpage_api.setKeyboardScrolling(false);\n\n//desabilitando a rolagem do teclado para baixo\nfullpage_api.setKeyboardScrolling(false, 'down');\n\n//desabilitando a rolagem do teclado para baixo e para a direita\nfullpage_api.setKeyboardScrolling(false, 'down, right');\n```\n---\n### setRecordHistory(boolean)\n[Demonstração](https://codepen.io/alvarotrigo/pen/rVZWQb) Define se deve registrar o histórico para cada alteração de hash na URL.\n\n```javascript\nfullpage_api.setRecordHistory(false);\n```\n---\n### setScrollingSpeed(milliseconds)\n[Demonstração](https://codepen.io/alvarotrigo/pen/NqLbeY) Define a velocidade de rolagem em milissegundos.\n\n```javascript\nfullpage_api.setScrollingSpeed(700);\n```\n---\n### destroy(type)\n[Demonstração](https://codepen.io/alvarotrigo/pen/bdxBzv) Destrói os eventos do plug-in e, opcionalmente, sua marcação e estilos HTML.\nIdeal para usar ao usar AJAX para carregar conteúdo.\n\n- `type`: (parâmetro opcional) pode ser vazio ou `all`. Se `all` for passado, a marcação HTML e os estilos usados por fullpage.js serão removidos. Desta forma, a marcação HTML original, aquela usada antes de qualquer modificação do plugin, será mantida.\n\n```javascript\n//destruindo todos os eventos Javascript criados pelo fullPage.js (scrolls, hashchange na URL...)\nfullpage_api.destroy();\n\n//destruindo todos os eventos Javascript e qualquer modificação feita pelo fullPage.js sobre sua marcação HTML original.\nfullpage_api.destroy('all');\n```\n---\n### reBuild()\nAtualiza a estrutura DOM para ajustar o novo tamanho da janela ou seu conteúdo.\n  Ideal para usar em combinação com chamadas AJAX ou mudanças externas na estrutura DOM do site, especialmente quando se utiliza `scrollOverflow:true`.\n\n```javascript\nfullpage_api.reBuild();\n```\n---\n### setResponsive(boolean)\n[Demonstração](https://codepen.io/alvarotrigo/pen/WxOyLA) Define o modo responsivo da página. Quando definido como `true`, o autoScrolling será desativado e o resultado será exatamente o mesmo de quando as opções `responsiveWidth` ou `responsiveHeight` forem acionadas.\n```javascript\nfullpage_api.setResponsive(true);\n```\n---\n### responsiveSlides.toSections()\n[Extensões do fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/). Requer fullpage.js >= 3.0.1.\nTransforma slides horizontais em seções verticais.\n\n```javascript\nfullpage_api.responsiveSlides.toSections();\n```\n---\n### responsiveSlides.toSlides()\n[Extensões do fullpage.js](https://alvarotrigo.com/fullPage/extensions/br/). Requer fullpage.js >= 3.0.1.\nVolta os slides originais (agora convertidos em seções verticais) em slides horizontais novamente.\n\n```javascript\nfullpage_api.responsiveSlides.toSlides();\n```\n\n## Callbacks\n[Demonstração](https://codepen.io/alvarotrigo/pen/XbPNQv) Você pode vê-los em ação [aqui](https://alvarotrigo.com/fullPage/examples/callbacks.html).\n\nAlguns retornos de chamada, como `onLeave`, conterão parâmetros do tipo Object contendo as seguintes propriedades:\n\n- `âncora`: *(String)* âncora do item.\n- `index`: *(Number)* índice do item.\n- `item`: *(elemento DOM)* elemento item.\n- `isFirst`: *(Boolean)* determina se o item é o primeiro filho.\n- `isLast`: *(Boolean)* determina se o item é o último filho.\n\n### afterLoad (`origin`, `destination`, `direction`, `trigger`)\n[Demonstração](https://codepen.io/alvarotrigo/pen/XbPNQv) Callback acionado após o carregamento das seções, após o término da rolagem.\nParâmetros:\n\n- `origin`: *(Object)* seção de origem.\n- `destination`: *(Object)* seção de destino.\n- `direction`: *(String)* levará os valores `up` ou `down` dependendo da direção de rolagem.\n- `trigger`: *(String)* indica o que acionou o scroll. Pode ser: \"wheel\", \"keydown\", \"menu\", \"slideArrow\", \"verticalNav\", \"horizontalNav\".\n\nExemplo:\n\n```javascript\nnew fullpage('#fullpage', {\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\n\n\tafterLoad: function(origin, destination, direction, trigger){\n\t\tvar origin = this;\n\n\t\t//usando index\n\t\tif(origin.index == 2){\n\t\t\talert(\"Section 3 ended loading\");\n\t\t}\n\n\t\t//usando anchorLink\n\t\tif(origin.anchor == 'secondSlide'){\n\t\t\talert(\"Section 2 ended loading\");\n\t\t}\n\t}\n});\n```\n\n---\n### onLeave (`origin`, `destination`, `direction`, `trigger`)\n[Demonstração](https://codepen.io/alvarotrigo/pen/XbPNQv) Esse retorno de chamada é acionado quando o usuário sai de uma seção, na transição para a nova seção.\nRetornar `false` cancelará a movimentação antes que ela ocorra.\n\nParâmetros:\n\n- `origin`: *(Object)* seção de origem.\n- `destination`: *(Object)* seção de destino.\n- `direction`: *(String)* levará os valores `up` ou `down` dependendo da direção de rolagem.\n- `trigger`: *(String)* indica o que acionou o scroll. Pode ser: \"wheel\", \"keydown\", \"menu\", \"slideArrow\", \"verticalNav\", \"horizontalNav\".\n\nExemplo:\n\n```javascript\nnew fullpage('#fullpage', {\n\tonLeave: function(origin, destination, direction, trigger){\n\t\tvar leavingSection = this;\n\n\t\t//depois de sair da seção 2\n\t\tif(origin.index == 1 && direction =='down'){\n\t\t\talert(\"Going to section 3!\");\n\t\t}\n\n\t\telse if(origin.index == 1 && direction == 'up'){\n\t\t\talert(\"Going to section 1!\");\n\t\t}\n\t}\n});\n```\n\n\n---\n### beforeLeave (`origin`, `destination`, `direction`, `trigger`)\n[Demonstração](https://codepen.io/alvarotrigo/pen/XbPNQv) Esse retorno de chamada é acionado imediatamente **antes** de sair da seção, pouco antes da transição.\n\nVocê pode usar esse retorno de chamada para impedir e cancelar a rolagem antes que ela ocorra retornando `false`.\n\nParâmetros:\n\n- `origin`: *(Object)* seção de origem.\n- `destination`: *(Object)* seção de destino.\n- `direction`: *(String)* levará os valores `up` ou `down` dependendo da direção de rolagem.\n- `trigger`: *(String)* indica o que acionou o scroll. Pode ser: \"wheel\", \"keydown\", \"menu\", \"slideArrow\", \"verticalNav\", \"horizontalNav\".\n\nExample:\n\n```javascript\n\nvar cont = 0;\nnew fullpage('#fullpage', {\n\tbeforeLeave: function(origin, destination, direction, trigger){\n\n\t\t// impede scroll até que tenhamos rolado 4 vezes\n\t\tcont++;\n\t\treturn cont === 4;\n\t}\n});\n```\n\n---\n### afterRender()\n[Demonstração](https://codepen.io/alvarotrigo/pen/XbPNQv) Esse retorno de chamada é acionado logo após a geração da estrutura da página. Este é o retorno de chamada que você deseja usar para inicializar outros plugins ou disparar qualquer código que exija que o documento esteja pronto (já que este plugin modifica o DOM para criar a estrutura resultante). Consulte [Perguntas Frequentes](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions) para obter mais informações.\n\nExample:\n\n```javascript\nnew fullpage('#fullpage', {\n\tafterRender: function(){\n\t\tvar pluginContainer = this;\n\t\talert(\"A estrutura DOM resultante está pronta\");\n\t}\n});\n```\n---\n### afterResize(`width`, `height`)\n[Demonstração](https://codepen.io/alvarotrigo/pen/XbPNQv) Este retorno de chamada é acionado após o redimensionamento da janela do navegador. Logo após as seções serem redimensionadas.\n\nParâmetros:\n\n- `width`: *(Number)* largura da janela.\n- `altura`: *(Number)* altura da janela.\n\nExemplo:\n\n```javascript\nnew fullpage('#fullpage', {\n\tafterResize: function(width, height){\n\t\tvar fullpageContainer = this;\n\t\talert(\"As seções terminaram de escalonar\");\n\t}\n});\n```\n---\n### afterReBuild()\n[Demonstração](https://codepen.io/alvarotrigo/pen/XbPNQv) Este retorno de chamada é acionado após a reconstrução manual de fullpage.js chamando `fullpage_api.reBuild()`.\n\nExemplo:\n\n```javascript\nnew fullpage('#fullpage', {\n\tafterReBuild: function(){\n\t\tconsole.log(\"fullPage.js foi reconstruído manualmente\");\n\t}\n});\n```\n---\n### afterResponsive(`isResponsive`)\n[Demonstração](https://codepen.io/alvarotrigo/pen/XbPNQv) Esse retorno de chamada é acionado depois que fullpage.js muda do modo normal para o modo responsivo ou do modo responsivo para o modo normal.\n\nParâmetros:\n\n- `isResponsive`: *(Boolean)* determina se entra no modo responsivo (`true`) ou volta ao modo normal (`false`).\n\nExemplo:\n\n```javascript\nnew fullpage('#fullpage', {\n\tafterResponsive: function(isResponsive){\n\t\talert(\"É responsivo: \" + isResponsive);\n\t}\n});\n```\n---\n### afterSlideLoad (`section`, `origin`, `destination`, `direction`, `trigger`)\n[Demonstração](https://codepen.io/alvarotrigo/pen/XbPNQv) O retorno de chamada é acionado quando o slide de uma seção é carregado, após o término da rolagem.\n\nParâmetros:\n\n- `section`: *(Object)* seção vertical ativa.\n- `origin`: *(Object)* slide horizontal de origem.\n- `destination`: *(Object)* slide horizontal de destino.\n- `direction`: *(String)* `right` ou `left` dependendo da direção de rolagem.\n- `trigger`: *(String)* indica o que acionou o scroll. Pode ser: \"wheel\", \"keydown\", \"menu\", \"slideArrow\", \"verticalNav\", \"horizontalNav\".\n\nExemplo:\n\n```javascript\nnew fullpage('#fullpage', {\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\n\n\tafterSlideLoad: function( section, origin, destination, direction, trigger){\n\t\tvar loadedSlide = this;\n\n\t\t//Primeiro slide da segunda seção\n\t\tif(section.anchor == 'secondPage' && destination.index == 1){\n\t\t\talert(\"Primeiro slide carregado\");\n\t\t}\n\n\t\t//Segundo slide da segunda seção (supondo que #secondSlide é âncora para a segunda seção)\n\t\tif(section.index == 1 && destination.anchor == 'secondSlide'){\n\t\t\talert(\"Segundo slide carregado\");\n\t\t}\n\t}\n});\n```\n\n\n---\n### onSlideLeave (`section`, `origin`, `destination`, `direction`, `trigger`)\n[Demonstração](https://codepen.io/alvarotrigo/pen/XbPNQv) Esse retorno de chamada é acionado quando o usuário sai de um slide para ir para outro, na transição para o novo slide.\nRetornar `false` cancelará a movimentação antes que ela ocorra.\n\nParâmetros:\n\n- `section`: *(Object)* seção vertical ativa.\n- `origin`: *(Object)* slide horizontal de origem.\n- `destination`: *(Object)* slide horizontal de destino.\n- `direction`: *(String)* `right` ou `left` dependendo da direção de rolagem.\n- `trigger`: *(String)* indica o que acionou o scroll. Pode ser: \"wheel\", \"keydown\", \"menu\", \"slideArrow\", \"verticalNav\", \"horizontalNav\".\n\nExample:\n\n```javascript\nnew fullpage('#fullpage', {\n\tonSlideLeave: function( section, origin, destination, direction, trigger){\n\t\tvar leavingSlide = this;\n\n\t\t//deixando o primeiro slide da 2ª Seção à direita\n\t\tif(section.index == 1 && origin.index == 0 && direction == 'right'){\n\t\t\talert(\"Saindo do primeiro slide!!\");\n\t\t}\n\n\t\t//deixando o 3º slide da 2ª Seção para a esquerda\n\t\tif(section.index == 1 && origin.index == 2 && direction == 'left'){\n\t\t\talert(\"Indo pro slide 2\");\n\t\t}\n\t}\n});\n```\n\n#### Cancelando um movimento antes que ele ocorra\nVocê pode cancelar um movimento retornando `false` no retorno de chamada `onSlideLeave`. [O mesmo que cancelar um movimento com `onLeave`](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese/#cancelling-the-scroll-before-it-takes-place).\n\n\n---\n### onScrollOverflow (`section`, `slide`, `position`, `direction`)\n[Demonstração](https://codepen.io/alvarotrigo/pen/XbPNQv) Este retorno de chamada é disparado quando uma rolagem dentro de uma seção rolável ao usar a opção fullPage.js `scrollOverflow: true`.\n\nParâmetros:\n\n- `section`: *(Object)* seção vertical ativa.\n- `slide`: *(Object)* slide horizontal de origem.\n- `position`: *(Integer)* quantidade rolada dentro da seção/slide. Começa em 0.\n- `direction`: *(String)* `up` ou `down`\n\nExemplo:\n\n```javascript\nnew fullpage('#fullpage', {\n\tonScrollOverflow: function( section, slide, position, direction){\n\t\tconsole.log(section);\n\t\tconsole.log(\"Posição: \" + position);\n\t}\n});\n```\n\n# Relatando problemas\n1. Por favor, procure seu problema antes de perguntar usando a pesquisa de Issues do github.\n2. Certifique-se de usar a versão mais recente do fullpage.js. Nenhum suporte é fornecido para versões mais antigas.\n3. Use o [fórum de Issues do Github](https://github.com/alvarotrigo/fullPage.js/issues) para criar Issues.\n4. **Será necessária uma reprodução isolada da edição.** Use o [jsfiddle](https://jsfiddle.net/alvarotrigo/ea17skjr/) ou [codepen](https://codepen.io/alvarotrigo /pen/NxyPPp) para isso, se possível.\n\n# Contribuindo para fullpage.js\nConsulte [Contribuindo para o fullpage.js](https://github.com/alvarotrigo/fullPage.js/wiki/Contributing-to-fullpage.js)\n\n# Changelogs\nPara ver a lista de alterações recentes, consulte a [seção Releases](https://github.com/alvarotrigo/fullPage.js/releases)\n\n# Tarefas de Build\nQuer buildar arquivos de distribuição do fullpage.js? Consulte [Tarefas de Build](https://github.com/alvarotrigo/fullPage.js/wiki/Build-tasks)\n\n# Recursos\n- Plugin Wordpress [para Gutenberg](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/) and [for Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/).\n- [Tema de Wordpress](https://alvarotrigo.com/fullPage/utils/wordpress.html)\n- [Componente wrapper Oificial para Vue.js](https://github.com/alvarotrigo/vue-fullpage.js)\n- [Componente wrapper Oificial para React.js ](https://github.com/alvarotrigo/react-fullpage)\n- [Angular Componente wrapper Oificial para Angular](https://github.com/alvarotrigo/angular-fullpage)\n- [CSS Easing Animation Tool - Matthew Lein](https://matthewlein.com/ceaser/) (useful to define the `easingcss3` value)\n- [fullPage.js jsDelivr CDN](https://www.jsdelivr.com/package/npm/fullpage.js)\n- [fullPage.js plugin for October CMS](https://github.com/freestream/oc-parallax-plugin)\n- [fullPage.js Angular2 directive](https://github.com/meiblorn/ng2-fullpage)\n- [fullPage.js angular directive](https://github.com/hellsan631/angular-fullpage.js)\n- [fullPage.js ember-cli addon](https://www.npmjs.com/package/ember-cli-fullpagejs)\n- [fullPage.js Rails Ruby Gem](https://rubygems.org/gems/fullpagejs-rails)\n- [Angular fullPage.js - Adaptation for Angular.js v1.x](https://github.com/mmautomatizacion/angular-fullpage.js)\n- [Integrating fullPage.js with Wordpress (Tutorial)](https://premium.wpmudev.org/blog/build-apple-inspired-full-page-scrolling-pages-for-your-wordpress-site/)\n- [Wordpress Plugin for Divi](https://alvarotrigo.com/fullPage/wordpress-plugin-divi/)\n- [Wordpress Plugin for Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/)\n\n## Quem está usando o fullPage.js\n\n![Who is using fullPage.js](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/using-fullpage.png)\n\n- http://www.bbc.co.uk/news/resources/idt-d88680d1-26f2-4863-be95-83298fd01e02\n- http://medoff.ua/en/\n- http://promo.prestigio.com/grace1/\n- http://torchbrowser.com/\n- http://www.boxreload.com/\n- http://boxx.hk/\n- http://www.villareginateodolinda.it\n\n## Patrocinadores\nTorne-se um patrocinador e obtenha seu logotipo em nosso README no Github com um link para seu site. [[Seja um patrocinador](https://alvarotrigo.com/#contact)] | [[Torne-se um patrocinador]](https://github.com/sponsors/alvarotrigo)\n\n[![Warp](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/warp.png)](http://go.warp.dev/fullPage)\n[![Crawlbase](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/crawlbase.png)](https://crawlbase.com/?utm_source=github&utm_medium=sponsor&utm_campaign=fullpagejs)\n[![TestMu](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/testmu-ai.png)](https://www.testmu.com/?utm_source=fullpagejs&utm_medium=sponsor)\n[![Codeless](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codeless.png)](https://codeless.co)\n[![Stackpath](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/stackpath3.png)](https://www.stackpath.com/)\n[![Browserstack](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/browserstack3.png)](http://www.browserstack.com/)\n[![CodePen](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codepen3.png)](https://codepen.com)\n\n### Pessoas\n\n<a href=\"https://github.com/alvarotrigo/fullPage.js/graphs/contributors\">\n  <img src=\"https://contrib.rocks/image?repo=alvarotrigo/fullPage.js&max=400&columns=25&anon=1&v=2\" />\n</a>\n"
  },
  {
    "path": "lang/brazilian-portuguese/how-to-activate-fullpage-extension.md",
    "content": "# Cómo activar una extension de fullPage.js\r\n\r\n1. Acesse https://alvarotrigo.com/fullPage/extensions/activationKey.html. (Que é o URL que é enviado a você por e-mail após a compra da extensão)\r\n1. Insira a *chave de licença* que lhe foi mostrada após a compra da extensão. Também disponível no e-mail de confirmação de compra.\r\n1. Dependendo da sua licença. Talvez seja necessário inserir um domínio para obter a **chave de ativação** do seu produto.\r\n1. Uma vez que você tenha a **chave de ativação** para sua extensão e domínio (gerada nas etapas anteriores), você deverá adicionar a opção correspondente à sua extensão na inicialização de fullPage.js. Isso estará na forma de ExtensionName + \"Key\": key.\r\n\r\nPor exemplo:\r\n\r\n```javascript\r\nvar myFullpage = new fullpage('#fullpage', {\r\n    fadingEffect: true,\r\n    fadingEffectKey: 'Cole a chave de ativação aqui',\r\n});\r\n```\r\n\r\nO mesmo aconteceria com o resto das extensões que você está usando.\r\nEstas são todas as opções possíveis para outras chaves de extensão:\r\n\r\n* `fadingEffectKey`\r\n* `responsiveSlidesKey`\r\n* `ContinuousHorizontalKey`\r\n* `interlockedSlidesKey`\r\n* `scrollHorizontallyKey`\r\n* `resetSlidersKey`\r\n* `offsetSectionsKey`\r\n* `dragAndMoveKey`\r\n* `parallaxKey`\r\n* `cardsKey`\r\n\r\nLembre-se que o uso de extensões requer o uso de [`fullpage.extensions.min.js`](https://github.com/alvarotrigo/fullPage.js/blob/master/dist/fullpage.extensions.min.js) em em vez do arquivo fullPage.js usual (`fullpage.js`) conforme explicado em [Usando extensões](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese# use-of-extensions ).\r\n\r\n### O que fazer para ambientes de desenvolvimento e sites de teste?\r\nO uso de uma chave de ativação não é necessário para ambientes de host local.\r\nSe você precisar usar uma extensão em um ambiente de desenvolvimento externo, poderá obter a chave de ativação desse domínio e, em seguida, [entre em contato](http://alvarotrigo.com/#contact) para obter outra chave ao movê-la para produção.\r\n\r\nSe você tiver uma licença que permite gerar várias chaves de ativação para vários domínios, convém usar o mesmo código JS para todos eles. Nesse caso, você pode usar um array com as diferentes chaves para cada domínio. Por exemplo, se estivermos usando a extensão `scrollHorizontally` para 3 domínios, podemos fazer o seguinte:\r\n\r\n```js\r\nnew fullPage('#fullpage', {\r\n    scrollHorizontally: true,\r\n    scrollHorizontallyKey: ['domain1_key', 'domain2_key', 'domain3_key'] \r\n});\r\n```\r\nDesta forma, a extensão pode ser usada em todos os 3 domínios.\r\n\r\n### Chave de licença x Chave de ativação\r\nSão chaves muito diferentes:\r\n- Você obtém a **chave de licença** ao comprar qualquer extensão.\r\n- Você obtém a **chave de ativação** ao ativar uma extensão para um domínio específico (a menos que use a licença de domínio ilimitado). Para gerar a chave de ativação, você precisará usar a chave de licença.\r\n\r\nA chave de licença é composta por 4 grupos de 8 caracteres cada (`XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX`) e a chave de ativação é de comprimento variável e não é composta por grupos separados (`XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`).\r\nÉ importante não confundir os dois."
  },
  {
    "path": "lang/brazilian-portuguese/parallax-extension.md",
    "content": "![](https://cloud.githubusercontent.com/assets/1706326/23580315/f28edab4-00f6-11e7-90f9-81ffafd77b0e.gif)\r\n\r\nLeia [como usar Extenões](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese#uso-de-extenões) antes de usar a opção de paralaxe.\r\n- [Ejemplo online](http://alvarotrigo.com/fullPage/extensions/parallax.html)\r\n- [Estrutura HTML necessária](#estrutura-html-necessária)\r\n- [Adicionando a imagem de fundo](#adicionando-a-imagem-de-fundo)\r\n- [Opções](#Opções)\r\n  - [Opções do efeito parallax](#opções-do-efeito-parallax)\r\n- [Métodos](#métodos)\r\n\r\n## Estrutura HTML necessária\r\nPara usar o efeito de paralaxe em seções ou slides, precisaremos adicionar um novo elemento que use a classe `fp-bg`. Será um elemento `div` vazio que colocaremos como o primeiro elemento abaixo da seção ou slide ao qual pertence.\r\n\r\n```html\r\n<div class=\"fp-bg\"></div>\r\n```\r\n\r\nNesse elemento, teremos que aplicar a imagem de fundo, em vez de fazê-lo diretamente na seção ou nos slides aos quais pertence.\r\n\r\nPor exemplo:\r\n```html\r\n<div id=\"fullpage\">\r\n    <div class=\"section\" id=\"section1\">\r\n        <div class=\"fp-bg\"></div>\r\n        Slide 1.1\r\n    </div>\r\n    <div class=\"section\" id=\"section2\">\r\n        <div class=\"slide\" id=\"slide2-1\">\r\n            <div class=\"fp-bg\"></div>\r\n            Slide 2.1\r\n        </div>\r\n        <div class=\"slide\" id=\"slide2-2\">\r\n            <div class=\"fp-bg\"></div>\r\n            Slide 2.2\r\n        </div>\r\n    </div>\r\n</div>\r\n```\r\n\r\nVocê pode ver esta mesma estrutura no código fonte do [exemplo de paralaxe](http://alvarotrigo.com/fullPage/extensions/parallax.html).\r\n\r\n> Se por algum motivo você não quiser adicionar um novo elemento fp-bg à Estrutura da Página, você pode usar a opção `property` dentro de `parallaxOptions` e definir seu valor como `background`. Dessa forma, você pode aplicar o plano de fundo diretamente na seção ou no slide.\r\n> Como será explicado posteriormente na seção Opções do efeito parallax, só recomendo fazer isso se for realmente necessário, pois o desempenho não será o mesmo de quando se utiliza o elemento `fp-bg`.\r\n\r\n<br>\r\n\r\n## Adicionando a imagem de fundo\r\nO plano de fundo deve ser aplicado diretamente sobre o elemento `fp-bg` da mesma forma que você faria em uma seção ou slide.\r\nVocê pode usar CSS para isso ou usar estilos inline através do atributo `style`.\r\n\r\nPor exemplo:\r\n```css\r\n#section1 .fp-bg{\r\n    background-image: url('imgs/alvaro-genious.jpg');\r\n    background-size: cover;\r\n    background-position: center 80%;\r\n}\r\n```\r\n\r\n## Opções\r\n\r\n| Opção | Descrição |\r\n| ------------- | ------------- |\r\n| **paralaxe** | (por padrão `falso`). [Extensão do fullPage.js](http://alvarotrigo.com/fullPage/extensions/). Determina se o efeito de paralaxe deve ser usado em seções e slides. Os valores possíveis são `false`, `true`, `sections`, `slides`|\r\n| **Opções de paralaxe:** | (padrão: `{ type: 'reveal', percentage: 62, property: 'translate'}`). Permite definir os parâmetros para o efeito de paralaxe ao usar a opção `parallax: true`. |\r\n<br>\r\n\r\n### Opções do efeito parallax\r\nVocê pode vê-los em ação na [página de exemplo](http://alvarotrigo.com/fullPage/extensions/parallax.html).\r\n\r\nDescrição das opções de configuração disponíveis na opção `parallaxOptions`:\r\n\r\n| Opções de paralaxe | Descrição |\r\n| ------------- | ------------- |\r\n| **tipo** | (o padrão é `reveal`) Os valores possíveis para esta opção são `cover` e `reveal`. Eles permitem que você escolha a maneira como as seções ou slides se sobrepõem, determinando se a seção/slide atual ficará acima ou abaixo do destino. Quando a opção `cover` é usada, a Seção/Slide de destino aparecerá para cobrir parte da Seção/Slide atual. Se `reveal` for usado, o efeito será o oposto e parte da seção de destino/Slide será coberta conforme aparece. |\r\n| **porcentagem** | (padrão 62) permite definir a porcentagem do efeito de paralaxe em relação à viewport (tamanho da tela). Usar um valor pequeno resultará em menos efeito de paralaxe, e usar 100, que é o máximo, mostrará um plano de fundo estático. |\r\n| **propriedades** | Determina se o efeito de paralaxe será aplicado ao elemento `fp-bg` ou diretamente à propriedade de fundo da seção/slide. Recomenda-se usar o valor padrão para esta opção. |\r\n\r\nObserve que usar o elemento `fp-bg` fornece um desempenho muito melhor e mais suave ao executar o efeito. Isso ocorre porque isso faz uso da aceleração de hardware ao usar o translate3d. A opção `background` está disponível para aqueles que por algum motivo não querem adicionar o elemento `fp-bg` extra ou que não podem modificar o código HTML.\r\n\r\n## Métodos\r\nVocê pode vê-los em ação na [página de exemplo](http://alvarotrigo.com/fullPage/extensions/parallax.html).\r\n\r\n### setOption(optionName, value)\r\nDefine um valor para a opção passada a ele como parâmetro. `optionName` pode ser qualquer uma das opções disponíveis em `parallaxOptions`. (`tipo`, `porcentagem` ou `propriedade`).\r\n\r\n```javascript\r\n//alterando o valor da propriedade `type`\r\nfullpage_api.parallax.setOption('type', 'cover');\r\n\r\n//alterando o valor da propriedade `percentage`\r\nfullpage_api.parallax.setOption('percentage', '30');\r\n```\r\n---\r\n\r\n### init()\r\nAtive o efeito de paralaxe. É útil quando você precisa habilitar esse efeito dinamicamente em um determinado momento.\r\n```javascript\r\nfullpage_api.parallax.init();\r\n```\r\n---\r\n### destroy()\r\nDesativa o efeito de paralaxe.\r\n```javascript\r\nfullpage_api.parallax.destroy();\r\n```\r\n"
  },
  {
    "path": "lang/chinese/README.md",
    "content": "# fullPage.js\r\n![preview](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/intro.png)\r\n![compatibility](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/compatible.png)\r\n\r\n<p align=\"center\">\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js\">English</a> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish#fullpagejs\">Español</a> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#fullpagejs\">Français</a> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian#fullpagejs\">Pусский</a> |\r\n  <span>中文</span> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#fullpagejs\">한국어</a> | \r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese#fullpagejs\"> 日本語</a> | \r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese#fullpagejs\">Português Brasileiro</a>\r\n</p>\r\n<p align=\"center\">\r\n\t适用于&nbsp;<a href=\"https://github.com/alvarotrigo/vue-fullpage.js\">Vue</a>&nbsp;,&nbsp;<a href=\"https://github.com/alvarotrigo/react-fullpage\">React</a>&nbsp;和&nbsp;<a href=\"https://github.com/alvarotrigo/angular-fullpage\">Angular</a>\r\n</p>\r\n\r\n---\r\n\r\n![fullPage.js version](https://img.shields.io/badge/fullPage.js-v4.0.41,2-brightgreen.svg)\r\n[![License](https://img.shields.io/badge/License-GPL-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.html)\r\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/fullpage.js/badge?style=rounded)](https://www.jsdelivr.com/package/npm/fullpage.js)\r\n[![Minzipped Size](https://img.shields.io/bundlephobia/minzip/fullpage.js)](https://bundlephobia.com/package/fullpage.js)\r\n&nbsp;&nbsp;**|**&nbsp;&nbsp; *Created by [@imac2](https://twitter.com/imac2)*\r\n\r\n- [示例](https://alvarotrigo.com/fullPage/) | [Codepen](https://codepen.io/alvarotrigo/pen/qqabrp)\r\n- [Wordpress plugin for Gutenberg](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/) and [WordPress pluging fo Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/)\r\n- [Wordpress 的主题](https://alvarotrigo.com/fullPage/utils/wordpress.html)\r\n- [fullpage.js 扩展](https://alvarotrigo.com/fullPage/extensions/)\r\n- [常见问题](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions)\r\n- [[Migration from fullPage v3 to fullpage v4]](https://alvarotrigo.com/fullPage/help/migration-from-fullpage-3/)\r\n---\r\n\r\n通过调用本库可轻易创建全屏滚动网站(也称为单页网站)。\r\n本库可创建全屏滚动网站，同时也可在网站中添加横向滚动条。\r\n\r\n- [介绍](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E4%BB%8B%E7%BB%8D)\r\n- [兼容性](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E5%85%BC%E5%AE%B9%E6%80%A7)\r\n- [许可证](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E8%AE%B8%E5%8F%AF%E8%AF%81)\r\n- [用法](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E7%94%A8%E6%B3%95)\r\n  - [创建链接到 section 或 slide](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E5%88%9B%E5%BB%BA%E9%93%BE%E6%8E%A5%E5%88%B0%E6%AE%B5%E8%90%BD%E6%88%96%E5%B9%BB%E7%81%AF%E7%89%87)\r\n  - [创建更小或更大的 section](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E5%88%9B%E5%BB%BA%E6%9B%B4%E5%B0%8F%E6%88%96%E6%9B%B4%E5%A4%A7%E7%9A%84%E6%AE%B5%E8%90%BD)\r\n  - [fullpage.js 添加的状态类](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E7%94%B1fullpagejs%E6%B7%BB%E5%8A%A0%E7%9A%84%E7%8A%B6%E6%80%81%E7%B1%BB)\r\n  - [快速加载](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E5%BB%B6%E8%BF%9F%E5%8A%A0%E8%BD%BD)\r\n  - [自动播放内嵌媒体](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E8%87%AA%E5%8A%A8%E6%92%AD%E6%94%BE%E6%9A%82%E5%81%9C%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%AA%92%E4%BD%93)\r\n  - [使用扩展](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E4%BD%BF%E7%94%A8%E6%89%A9%E5%B1%95)\r\n- [参数](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E9%80%89%E9%A1%B9)\r\n- [公共方法](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E6%96%B9%E6%B3%95)\r\n- [回调函数](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#callbacks)\r\n- [问题反馈](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E6%8A%A5%E5%91%8A%E9%97%AE%E9%A2%98)\r\n- [贡献到 fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E8%B4%A1%E7%8C%AE%E7%BB%99fullpagejs)\r\n- [更新日志](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97)\r\n- [编译构建](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E6%9E%84%E5%BB%BA%E4%BB%BB%E5%8A%A1)\r\n- [参考资源](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E5%8F%82%E8%80%83%E8%B5%84%E6%BA%90)\r\n- [谁在使用 fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E8%B0%81%E5%9C%A8%E4%BD%BF%E7%94%A8-fullpagejs)\r\n- [赞助](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E6%8D%90%E7%8C%AE)\r\n\r\n## 介绍\r\n不仅限于提需求，也欢迎提出编码风格改进的建议。\r\n集思广益，让这个库更加强大，让写代码更轻松！\r\n\r\n## 兼容性\r\nfullPage.js is fully functional on all modern browsers and with IE 11. If you need to support IE < 11 consider using [fullPage.js v3](https://github.com/alvarotrigo/fullPage.js/tree/3.1.2).\r\nIt also provides touch support for mobile phones, tablets and touch screen computers.\r\n\r\n特别感谢 [Browserstack](https://www.browserstack.com/) 支持 fullpage.js 。\r\n\r\n## 许可证\r\n\r\n### 商业许可证\r\n如果您想使用 fullPage 开发商业网站、主题、项目和应用程序，商业许可证是您应使用的许可证。使用这个许可证，您的源代码将保留专有权。 这意味着，您不必将整个应用程序源代码更改为开源许可证。[点击此处购买fullpage 商业许可证](https://alvarotrigo.com/fullPage/pricing/)\r\n\r\n### 开源许可证\r\n如果您使用与 [GNU GPL license v3](https://www.gnu.org/licenses/gpl-3.0.html) 兼容的许可证创建开源应用程序，则可以在 GPLv3 条款下使用 fullPage。\r\n\r\n**You will have to provide a prominent notice that fullPage.js is in use. JavaScript 和 CSS 文件中的认可的意见应保持完整的许可证 (即使在合并或压缩后）**\r\n\r\n[阅读更多关于 fullPage 的许可证](https://alvarotrigo.com/fullPage/pricing/)。\r\n\r\n\r\n\r\n\r\n## 用法\r\n正如示例文件所示，需要引用：\r\n - JavaScript 文件 `fullpage.js` (或其压缩版本 `fullpage.min.js`)\r\n - css 文件 `fullpage.css`\r\n\r\n**可选**，使用 `css3:false` 时，如果您想要使用库中包含的其他缓动效果的功能（ `easeInOutCubic` ），您可以添加 [easings file](https://github.com/alvarotrigo/fullPage.js/tree/master/vendors/easings.min.js)。\r\n\r\n### 使用 bower 或 npm 进行安装\r\n**或者**，如果您愿意，可以使用 bower 或 npm 安装 fullPage.js：\r\n\r\n终端：\r\n```shell\r\n// 使用 bower\r\nbower install fullpage.js\r\n\r\n// 使用 npm\r\nnpm install fullpage.js\r\n```\r\n\r\n### 包含文件：\r\n```html\r\n<link rel=\"stylesheet\" type=\"text/css\" href=\"fullpage.css\" />\r\n\r\n<!-- 以下行是可选的。 只有在使用选项 css3:false ，并且您希望使用其他缓动效果，而非 linear 、 swing 或 easeInOutCubic 时才有必要。 -->\r\n<script src=\"vendors/easings.min.js\"></script>\r\n\r\n<script type=\"text/javascript\" src=\"fullpage.js\"></script>\r\n```\r\n\r\nUsing Webpack, Browserify or Require.js? Check [how to use fullPage.js with module loaders](https://github.com/alvarotrigo/fullPage.js/wiki/Use-module-loaders-for-fullPage.js)</a> .\r\n\r\n### 可选用 CDN ：\r\n如果您倾向使用 CDN 载入所需文件，fullPage.js 在 [JSDelivr](https://www.jsdelivr.com/package/npm/fullpage.js), [UNPKG](https://unpkg.com/browse/fullpage.js/dist/), [CDNJS](https://cdnjs.com/libraries/fullPage.js)...\r\n\r\n### 要求 HTML 结构\r\nHTML 文件中的首行 HTML 代码必须使用 [HTML DOCTYPE 声明](https://www.corelangs.com/html/introduction/doctype.html)，否则可能会遇到代码段高度问题。HTML 5 doctype 中的示例： `<!DOCTYPE html>`.\r\n\r\n每个代码段定义为包含 `section` 类的元素。\r\n默认情况下，第一个 section 代码段，将被视为主页。\r\n代码段应进行封装（即 `<div id=\"fullpage\">` ）。 封装不能是 `body` 元素。\r\n\r\n```html\r\n<div id=\"fullpage\">\r\n\t<div class=\"section\">Some section</div>\r\n\t<div class=\"section\">Some section</div>\r\n\t<div class=\"section\">Some section</div>\r\n\t<div class=\"section\">Some section</div>\r\n</div>\r\n```\r\n如果你想定义一个与众不同的起始页面，而不是原始第一段或第一个滑动页，只需将 `active` 类添加到你想首先载入的段或滑动页。\r\n```html\r\n<div class=\"section active\">Some section</div>\r\n```\r\n为在代码段中创建横向滑块，每个滑动页将默认定义为包含 `slide` 类的元素：\r\n\r\n```html\r\n<div class=\"section\">\r\n\t<div class=\"slide\"> slide 1 </div>\r\n\t<div class=\"slide\"> slide 2 </div>\r\n\t<div class=\"slide\"> slide 3 </div>\r\n\t<div class=\"slide\"> slide 4 </div>\r\n</div>\r\n````\r\n可以在 [simple.html 文件](https://github.com/alvarotrigo/fullPage.js/tree/master/examples/simple.html) 看到完整的 HTML 结构的例子\r\n\r\n### 初始化\r\n\r\n#### 用 Vanilla Javascript 初始化\r\n您只需要在关闭 `</body>` 标签之前调用 fullPage.js。\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\t//options here\r\n\tautoScrolling:true,\r\n\tscrollHorizontally: true\r\n});\r\n```\r\n\r\n#### 使用 jQuery 进行初始化\r\n如果您需要，您也可以将 fullpage.js 作为 jQuery 插件使用！\r\n\r\n```javascript\r\n$(document).ready(function() {\r\n\t$('#fullpage').fullpage({\r\n\t\t//options here\r\n\t\tautoScrolling:true,\r\n\t\tscrollHorizontally: true\r\n\t});\r\n\r\n\t// Example of how to use fullpage.js methods\r\n\t$.fn.fullpage.setAllowScrolling(false);\r\n});\r\n```\r\n\r\n#### 带有所有功能选项的 Vanilla JS 演示\r\n所有选项的更复杂的初始化如下所示：\r\n```javascript\r\nvar myFullpage = new fullpage('#fullpage', {\r\n\t// 导航\r\n\tmenu: '#menu',\r\n\tlockAnchors: false,\r\n\tanchors:['firstPage', 'secondPage'],\r\n\tnavigation: false,\r\n\tnavigationPosition: 'right',\r\n\tnavigationTooltips: ['firstSlide', 'secondSlide'],\r\n\tshowActiveTooltip: false,\r\n\tslidesNavigation: false,\r\n\tslidesNavPosition: 'bottom',\r\n\r\n\t// 滚动\r\n\tcss3: true,\r\n\tscrollingSpeed: 700,\r\n\tautoScrolling: true,\r\n\tfitToSection: true,\r\n\tfitToSectionDelay: 600,\r\n\tscrollBar: false,\r\n\teasing: 'easeInOutCubic',\r\n\teasingcss3: 'ease',\r\n\tloopBottom: false,\r\n\tloopTop: false,\r\n\tloopHorizontal: true,\r\n\tcontinuousVertical: false,\r\n\tcontinuousHorizontal: false,\r\n\tscrollHorizontally: false,\r\n\tinterlockedSlides: false,\r\n\tdragAndMove: false,\r\n\toffsetSections: false,\r\n\tresetSliders: false,\r\n\tfadingEffect: false,\r\n\tnormalScrollElements: '#element1, .element2',\r\n\tscrollOverflow: true,\r\n\tscrollOverflowMacStyle: false,\r\n\tscrollOverflowReset: false,\r\n\ttouchSensitivity: 15,\r\n\tbigSectionsDestination: null,\r\n\tadjustOnNavChange: true,\r\n\r\n\t// 可访问\r\n\tkeyboardScrolling: true,\r\n\tanimateAnchor: true,\r\n\trecordHistory: true,\r\n\r\n\t// 布局\r\n\tcontrolArrows: true,\r\n\tcontrolArrowsHTML: [\r\n\t\t'<div class=\"fp-arrow\"></div>', \r\n\t\t'<div class=\"fp-arrow\"></div>'\r\n\t],\r\n\tverticalCentered: true,\r\n\tsectionsColor : ['#ccc', '#fff'],\r\n\tpaddingTop: '3em',\r\n\tpaddingBottom: '10px',\r\n\tfixedElements: '#header, .footer',\r\n\tresponsiveWidth: 0,\r\n\tresponsiveHeight: 0,\r\n\tresponsiveSlides: false,\r\n\tcinematic: false,\r\n\tcinematicOptions: [Object],\r\n\teffects: false,\r\n\teffectsOptions: [Object],\r\n\tparallax: false,\r\n\tparallaxOptions: {type: 'reveal', percentage: 62, property: 'translate'},\r\n\tdropEffect: false,\r\n\tdropEffectOptions: { speed: 2300, color: '#F82F4D', zIndex: 9999},\r\n\twaterEffect: false,\r\n\twaterEffectOptions: { animateContent: true, animateOnMouseMove: true},\r\n\tcards: false,\r\n\tcardsOptions: {perspective: 100, fadeContent: true, fadeBackground: true},\r\n\r\n\r\n\t// 自定义选择器\r\n\tsectionSelector: '.section',\r\n\tslideSelector: '.slide',\r\n\r\n\tlazyLoading: true,\r\n\tlazyLoadThreshold: 0,\r\n\tobserver: true,\r\n\tcredits: { enabled: true, label: 'Made with fullPage.js', position: 'right'},\r\n\r\n\t// 事件\r\n\tbeforeLeave: function(origin, destination, direction, trigger){},\r\n\tonLeave: function(origin, destination, direction, trigger){},\r\n\tafterLoad: function(origin, destination, direction, trigger){},\r\n\tafterRender: function(){},\r\n\tafterResize: function(width, height){},\r\n\tafterReBuild: function(){},\r\n\tafterResponsive: function(isResponsive){},\r\n\tafterSlideLoad: function(section, origin, destination, direction, trigger){},\r\n\tonSlideLeave: function(section, origin, destination, direction, trigger){},\r\n\tonScrollOverflow: function(section, slide, position, direction){}\r\n});\r\n```\r\n\r\n### 创建链接到 section 或 slide\r\n如果你在 section 中使用 fullPage.js 和锚链接（在每个 section 使用 `anchors` 选项或属性 `data-anchor` ），那么你将能够在一个 section 里使用锚链接直接导航到某个 slide。\r\n\r\n这是一个锚链接的例子：\r\nhttps://alvarotrigo.com/fullPage/#secondPage/2 （在你手动访问该 section/slide 就会看到的 URL ）\r\n请注意，URL 的最后部分以 `＃secondPage / 2` 结尾。\r\n\r\n以下初始化：\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors:['firstPage', 'secondPage', 'thirdPage']\r\n});\r\n```\r\n\r\nURL `#secondPage/2`  结尾处的锚分别定义了目标 section 和 slide 。 在前面的 URL 中，目标 section 将是使用锚点  `secondPage`  定义的 section ，slide 将会是第 2 张 slide ，因为我们使用索引  `2`  。 （一个 section 的第一个 slide 有索引 0 ，在技术上这是一个 section ）。\r\n\r\n如果我们在HTML标记中使用属性 `data-anchor` ，就可以使用自定义锚点来代替它的索引：\r\n\r\n```html\r\n<div class=\"section\">\r\n\t<div class=\"slide\" data-anchor=\"slide1\"> slide 1 </div>\r\n\t<div class=\"slide\" data-anchor=\"slide2\"> slide 2 </div>\r\n\t<div class=\"slide\" data-anchor=\"slide3\"> slide 3 </div>\r\n\t<div class=\"slide\" data-anchor=\"slide4\"> slide 4 </div>\r\n</div>\r\n```\r\n在最后一种情况中，我们使用的URL将是 `#secondPage/slide3` ，这相当于之前的 `#secondPage/2` 。\r\n\r\n请注意，如果没有提供 `anchors` 数组，则也可以使用 `data-anchor` 属性以同样的方式定义节锚点。\r\n\r\n**注意！**`data-anchor` 标记的值不能与站点上的任何 ID 元素（或 IE 的 NAME 元素）相同。\r\n\r\n### 创建更小或更大的 section\r\n[演示](https://codepen.io/alvarotrigo/pen/BKjRYm) fullPage.js 提供了一种方法来删除 section 和 slide 的全屏高度限制。 可以创建高度小于或大于视图的section 。 这是页脚的理想方式。\r\n需明白所有 section 使用此功能并没有意义，这一点很重要。 如果网站的初始加载中有多个 section，则fullPage.js 将不会滚动以查看下一个 section ，因为它已经在视图中。\r\n\r\n创建更小的 section ，只需在要应用的 section 中使用 `fp-auto-height`  类即可，则可以调用您的 section/slide 中定义的高度。\r\n\r\n```html\r\n<div class=\"section\">整个视图</div>\r\n<div class=\"section fp-auto-height\">自动高度</div>\r\n```\r\n\r\n#### section 响应自动高度\r\n[演示](https://codepen.io/alvarotrigo/pen/MzByMa) 响应自动高度可以通过使用 `fp-auto-height-responsive` 类来调用。 这种方式 section 将全屏，直到响应模式终止。 根据定义调整大小，可能是大于或小于视口。\r\n\r\n### 由 fullpage.js 添加的状态类\r\nFullpage.js 在不同的元素中添加多个类型来保存网站状态的记录：\r\n\r\n- `active` 被添加到当前可见 section 和 slide 。\r\n- `active` 被添加到当前菜单元素（如果使用 `menu` 选项）。\r\n- `fp-loaded` 会添加到触发媒体内容懒加载的 section 或 slide 元素上。\r\n- `fp-viewing-SECTION-SLIDE` 形式的类型被添加到网站的 `body` 元素中。(例如： [`fp-viewing-secondPage-0`](https://alvarotrigo.com/fullPage/#secondPage)) `SECTION` 和 `SLIDE` 部分将成为当前 section 和 slide 的锚（或索引，如果没有提供锚）。\r\n- 当进入响应模式时，`fp-responsive` 添加到 `body` 元素\r\n- 当启用 fullpage.js 时，`fp-enabled` 添加到 `html` 元素。 （并在销毁时被移除）。\r\n- 当 fullPage.js 被销毁时，`fp-destroyed` 被添加到 fullpage.js 容器中。\r\n\r\n### 懒加载\r\n[演示](https://codepen.io/alvarotrigo/pen/eNLBXo) fullPage.js 提供了一种延迟加载图像、视频和音频元素的方式，这样它们不会减缓网站的加载速度，也不会浪费数据传输。\r\n当使用懒加载时，所有这些元素只有在进入视口时才会加载。\r\n要启用懒加载，您只需将 `src` 属性更改为 `data-src` ，如下所示：\r\n\r\n```\r\n<img data-src=\"image.png\">\r\n<video>\r\n\t<source data-src=\"video.webm\" type=\"video/webm\" />\r\n\t<source data-src=\"video.mp4\" type=\"video/mp4\" />\r\n</video>\r\n```\r\n\r\n如果您已经使用另一个使用 `data-src` 的延懒载解决方案，则可以通过设置 `lazyLoading: false` 选项来禁用fullPage.js 懒加载。\r\n\r\n### 自动播放/暂停嵌入式媒体\r\n\r\n[演示](https://codepen.io/alvarotrigo/pen/pXEaaK) **注意**：根据操作系统和浏览器的不同，自动播放功能可能无法在某些移动设备上使用（即 [IOS 的 Safari](https://webkit.org/blog/6784/new-video-policies-for-ios/) 版本 < 10.0）。\r\n\r\n#### 在 section/slide 载入：\r\n对于视频或音频使用属性 `autoplay`，或者对于 youtube iframe 使用参数 `autoplay=1` 将使得在加载页面时播放媒体元素。\r\n在 section/slide 载入使用而不是属性 `data-autoplay` 播放。 例如：\r\n\r\n```html\r\n<audio data-autoplay>\r\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\r\n</audio>\r\n```\r\n\r\n#### 失焦暂停\r\n嵌入式 HTML5 `<video>` / `<audio>` 和 Youtube iframe 在离开某个 section 或 slide 时自动暂停。 可以通过使用属性 `data-keepplaying` 来禁用。 例如：\r\n```html\r\n<audio data-keepplaying>\r\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\r\n</audio>\r\n```\r\n\r\n### 使用扩展\r\nfullpage.js [提供了一组扩展](https://alvarotrigo.com/fullPage/extensions/) 您可以使用它来增强其默认功能。 所有这些都被列为 [fullpage.js 选项](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E9%80%89%E9%A1%B9).\r\n\r\n扩展需要使用在 [`dist` 文件夹](https://github.com/alvarotrigo/fullPage.js/tree/master/dist/) 中的压缩文件 [`fullpage.extensions.min.js`](https://github.com/alvarotrigo/fullPage.js/tree/master/dist/fullpage.extensions.min.js)，而不是一贯的使用 fullPage.js 文件 (`fullpage.js` 或 `fullpage.min.js`)。\r\n\r\n一旦你需要扩展文件，你需要在 fullPage 之前添加它。 例如，如果我想要使用 Continuos Horizontal 扩展，我将包含扩展文件，然后包含 fullPage 文件的扩展版本。\r\n\r\n```html\r\n<script type=\"text/javascript\" src=\"fullpage.continuousHorizontal.min.js\"></script>\r\n<script type=\"text/javascript\" src=\"fullpage/fullpage.extensions.min.js\"></script>\r\n```\r\n\r\n每个扩展都需要激活密钥和许可证密钥。[在这里看到更多细节](https://github.com/alvarotrigo/fullPage.js/blob/master/lang/chinese/how-to-activate-fullpage-extension.md).\r\n\r\n然后你就可以按照 [选项](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E9%80%89%E9%A1%B9) 的说明使用和配置它们。\r\n\r\n## 参数\r\n\r\n### licenseKey\r\n（ 默认 `null` ）。 **此选项是强制性的。**如果您在非开源项目中使用 fullPage ，则应使用购买fullPage 商业许可证时提供的许可证密钥。 如果您的项目是开放的，请[与我 [联系](https://alvarotrigo.com/fullPage/extensions/requestKey.html) 并提供指向您的存储库的链接以获取许可证密钥。 请阅读更多关于许可 [这里](https://github.com/alvarotrigo/fullPage.js#license) 和 [在网页上](https://alvarotrigo.com/fullPage/pricing/) 。例如：\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tlicenseKey: 'YOUR_KEY_HERE'\r\n});\r\n```\r\n\r\n### controlArrows\r\n（默认为 `true`）确定是否将 slide 的控制箭头向右或向左移动。\r\n\r\n### controlArrowsHTML\r\n（默认为 `['<div class=\"fp-arrow\"></div>', '<div class=\"fp-arrow\"></div>'],`). Provides a way to define the HTML structure and the classes that you want to apply to the control arrows for sections with horizontal slides. The array contains the structure for both arrows. The first item is the left arrow and the second, the right one. (translation needed)\r\n\r\n### verticalCentered\r\n（默认为`true`）在 section 内部垂直居中。(Uses flexbox) You might want to wrap your content in a `div` to avoid potential issues. (Uses `flex-direction: column; display: flex; justify-content: center;`)\r\n\r\n### scrollingSpeed\r\n（默认 `700` ）滚动转换的速度（以毫秒为单位）。\r\n\r\n### sectionsColor\r\n（默认 `none` ）为每个 section 定义 CSS `background-color ` 属性。\r\n例：\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tsectionsColor: ['#f2f2f2', '#4BBFC3', '#7BAABE', 'whitesmoke', '#000'],\r\n});\r\n```\r\n\r\n### anchors\r\n（默认`[]`）定义要在每个 section 的 URL 上显示的锚链接（#example）。 锚点的值应该是独一无二的。 数组中的锚的位置将限定锚被应用于哪些部分。 （第二 section 的第二个位置等等）。 通过浏览器也可以使用锚点向前和向后导航。 该选项还允许用户为特定的 section 或 slide 添加书签。 **注意！**锚点不能与站点上的任何 ID 元素（或 IE 的 NAME 元素）具有相同的值。\r\n现在可以通过使用属性 `data-anchor` 直接在 HTML 结构中定义锚点，如此处所述。\r\n\r\n### lockAnchors\r\n（默认为 `false` ）确定 URL 中的锚是否在库中完全有效。 您仍然可以在函数和回调内部使用锚，但是它们在滚动网站时不起任何作用。 如果你想在 URL 中使用锚点来将 fullPage.js 和其他插件结合起来，那就很有用。\r\n\r\n### easing`\r\n（默认 `easeInOutCubic` ）定义用于垂直和水平滚动的过渡效果。\r\n它需要文件 `vendors/easings.min.js` 或 [jQuery UI](https://jqueryui.com/) 来使用 [它的转换](https://api.jqueryui.com/easings/) 。 其他库可以用来代替。\r\n\r\n### easingcss3\r\n（默认 `ease` ）定义在使用 `css3：true` 的情况下使用的过渡效果。 你可以使用 [预定义的](https://www.w3schools.com/cssref/css3_pr_transition-timing-function.asp)（比如 `linear`，`ease-out` ...）或者使用 `贝塞尔曲线` 功能创建你自己的效果。 你可能想使用 [Matthew Lein CSS缓动动画工具](https://matthewlein.com/ceaser/) 。\r\n\r\n### loopTop\r\n（默认为 `false`）定义首尾链接滚动方式(首向上)。\r\n\r\n### loopBottom\r\n（默认为 `false`）定义首尾链接滚动方式(尾向下)。\r\n\r\n### loopHorizontal\r\n（默认为 `true` ）定义水平滑块是否在到达上一张或下一张后循环。\r\n\r\n### css3\r\n（默认 `true` ）。 定义 section 或 slide 转换动画使用 JavaScript 还是 CSS3 。 有助于通过支持 CSS3 的浏览器加速平板电脑和移动设备的移动。 如果此选项设置为 `true` ，并且浏览器不支持 CSS3 ，则将使用后者。\r\n\r\n### autoScrolling\r\n（默认为 `true` ）定义是使用“自动”滚动还是“正常”滚动。 它同时也影响了平板电脑和移动电话中浏览器/设备窗口部分适配的方式。\r\n\r\n### fitToSection\r\n（默认为 `true` ）确定是否将 section 适应视图。 当设置为 `true` 时，当前激活 section 将始终填充整个视图。 否者，section 可以停留在网页的任何位置。\r\n\r\n### fitToSection\r\n（默认为 `true` ）确定是否将 section 适应视图。 当设置为 `true` 时，当前激活 section 将始终填充整个视图。 否者，section 可以停留在网页的任何位置。\r\n\r\n### scrollBar\r\n（默认 `false` ）确定是否使用站点的滚动条。 在使用滚动条的情况下，`autoScrolling` 功能仍将按预期工作。 用户也可以使用滚动条自由滚动网站，当滚动完成时，fullPage.js 将适配屏幕上的部分。\r\n\r\n### paddingTop\r\n（默认 `0` ）用数值和相对长度（paddingTop：'10px'，paddingTop：'10em'...）定义每个 section 的内边距( top )。\r\n\r\n### paddingBottom\r\n（默认为 `0` ）用数值和相对长度（paddingBottom：'10px'，paddingBottom：'10em'...）定义每个 section 的内边距( bottom )。 有利于有固定页脚的情况。\r\n\r\n### fixedElements\r\n（默认 `null` ）当使用 `css3` 选项保持固定时，定义哪些元素将从插件的滚动结构中移除。 它需要带有 Javascript 选择器的字符来表示这些元素。 （例如：`fixedElements：'＃element1，.element2'`）。\r\n\r\n### normalScrollElements\r\n（默认 `null` ）[示例](https://codepen.io/alvarotrigo/pen/RmVazM) 如果你想在滚动某些元素时避免自动滚动，这是你需要使用的选项。 （地图，滚动 div 等有用）它需要带有 Javascript 选择器的字符来表示这些元素。（例如：`normalScrollElements：'＃element1，.element2'` ）。 此选项不应该应用于任何 section/slide 元素本身。\r\n\r\n### bigSectionsDestination\r\n（默认 `null` ）[示例](https://codepen.io/alvarotrigo/pen/vYLdMrx) 定义如何滚动到超出视图的 section。 默认情况下，如果此section 在目标视图的顶部，fullPage.js 将滚动到顶部，如果此 section 在目标视图的底部，则会滚动到底部。 可选的值是 `top`，`bottom`，`null`。\r\n\r\n### adjustOnNavChange\r\n(（默认 `true`)\r\n定义当移动设备上的导航栏或地址栏更改大小或切换可见性时，fullPage.js 是否调整部分的高度。如果设置为 `false`，当导航栏缩小或隐藏时，部分将不会显示为全高度。\r\n\r\n### keyboardScrolling\r\n（默认为 `true` ）定义是否可以使用键盘进行内容滑动。\r\n\r\n### touchSensitivity\r\n（默认 `5`）定义浏览器窗口宽度/高度的百分比，和触发滑动到下一个 section/slide 的距离的灵敏度。\r\n\r\n### skipIntermediateItems\r\n(默认值 `false`)。确定在导航非连续的垂直部分或水平幻灯片时是否跳过滚动动画。可能的值包括 `true`、`false`、`sections` 和 `slides`，允许您将此行为应用于垂直方向、 水平方向或两个方向。\r\n\r\n### continuousVertical\r\n（默认为 `false`）定义首位链接循环(最后一个 section 向下滚动，滚动到第一个section，或第一个 section 向上滚动时滚动到最后一个 section )。 不兼容 `loopTop` ，`loopBottom` 或站点中存在的任何滚动条（`scrollBar：true` 或 `autoScrolling：false` ）。\r\n\r\n### continuousHorizontal\r\n（默认 `false` ）[fullpage.js 的扩展](https://alvarotrigo.com/fullPage/extensions/)。 定义首位链接循环(最后一个 section 向下滚动，滚动到第一个 section ，或第一个 section 向上滚动时滚动到最后一个 section)。 不兼容`loopHorizontal`。 需要 fullpage.js> = 3.0.1。\r\n\r\n### scrollHorizontally\r\n（默认 `false` ）[fullpage.js 的扩展](https://alvarotrigo.com/fullPage/extensions/)。 定义是否使用鼠标滚轮或触控板在滑块内水平滑动。 它是在使用: `autoScrolling:true` 的理想状态. 需要 fullpage.js> = 3.0.1。\r\n\r\n### interlockedSlides\r\n（默认`false`）[fullpage.js 的扩展](https://alvarotrigo.com/fullPage/extensions/)。 确定移动一个水平滑块是否会强制滑块同方向上滑动到其他区域。 可选的值是 `true`，`false` 或带有互锁部分的数组。 例如 `[1,3,5]` 从 1 开始。需要fullpage.js> = 3.0.1。\r\n\r\n### dragAndMove\r\n（默认`false`）[fullpage.js 的扩展](https://alvarotrigo.com/fullPage/extensions/)。 启用或禁用鼠标或手指 section 或 slide 的触摸拖拽。 需要 fullpage.js> = 3.0.1。 可选的值是：\r\n  - `true`: 启用该功能。\r\n  - `false`: 禁用该功能。\r\n  - `vertical`: 只能在垂直情况下启用该功能。\r\n  - `horizontal`: 只能在水平情况下启用该功能。\r\n  - `fingersonly`: 仅启用触摸设备的功能。\r\n  - `mouseonly`: 仅启用桌面设备的功能（鼠标和触控板）。\r\n\r\n### offsetSections\r\n（默认 `false`）[fullpage.js 的扩展](https://alvarotrigo.com/fullPage/extensions/)。 提供基于百分比使用非全屏幕 section 的方法。 通过显示下 section 或上 section 的内容，适合向访问者显示网站中的更多内容。 需要 fullPage.js> = 3.0.1\r\n要定义每 section 的百分比，必须使用属性 `data-percentage` 。 可以通过在属性 `data-centered` 中使用布尔值来使视图中 section 居中（如果未指定，则默认为 `true` ）。 例如：\r\n\r\n``` html\r\n<div class=\"section\" data-percentage=\"80\" data-centered=\"true\">\r\n```\r\n\r\n### resetSliders\r\n（默认 `false` ）。 [fullpage.js 的扩展](https://alvarotrigo.com/fullPage/extensions/)。 定义是否在离 section 后重置每个滑块。 需要fullpage.js> = 3.0.1。\r\n\r\n### fadingEffect\r\n（默认 `false` ）。 [fullpage.js 的扩展](https://alvarotrigo.com/fullPage/extensions/)。 定义是否使用淡入淡出效果，而不是默认的滚动效果。 可选的值是 `true`，`false`，`sections`，`slides` 。 它可以应用于垂直或水平方向，或者同时应用于两者。 需要 fullpage.js> = 3.0.1。\r\n\r\n### animateAnchor\r\n（默认`true`）定义锚点（＃）将以动画方式滚动或直接加载到目标 section。\r\n\r\n### recordHistory\r\n（默认为`true`）定义是否将网站的状态记录到浏览器的历史记录。 设置为 `true` 时，网站的每个 section/slide 片将作为新页面，浏览器的后退和前进按钮将滚动 section/slide 以达到网站的上一个或下一个状态。 当设置为 `false` 时，URL 将保持更改，但不会影响浏览器的历史记录。 使用 `autoScrolling：false` 时，该选项会自动关闭。\r\n\r\n### menu\r\n（默认 `false` ）选择器可以用来指定菜单链接到锚。 这样 section 的滚动将使用 active 状态激活菜单中的相应元素。这不会生成菜单，而只是将 active 状态添加到给定菜单中的元素，并带有相应的锚链接。\r\n为了将菜单的元素与各个部分相链接，将需要一个HTML 5 数据标签（data-menuanchor）来关联在 section中使用的锚链接。 例：\r\n\r\n```html\r\n<ul id=\"myMenu\">\r\n\t<li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">First section</a></li>\r\n\t<li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second section</a></li>\r\n\t<li data-menuanchor=\"thirdPage\"><a href=\"#thirdPage\">Third section</a></li>\r\n\t<li data-menuanchor=\"fourthPage\"><a href=\"#fourthPage\">Fourth section</a></li>\r\n</ul>\r\n```\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\r\n\tmenu: '#myMenu'\r\n});\r\n```\r\n\r\n**注意：** 菜单元素应放置在 fullpage 包裹对象外，以避免使用 `css3：true` 时出现问题。 否则它会被插件本身附加到 `body` 。\r\n\r\n### navigation\r\n（默认 `false` ）如果设置为 `true` ，则会显示一个由小圆圈组成的导航栏。\r\n\r\n### navigationPosition\r\n（默认 `none` ）可以设置为 `left` 或 `right` ，并定义导航栏显示的位置（如果使用的话）。\r\n\r\n### navigationTooltips\r\n（默认为[]）定义要使用导航圈的提示。 例如：`navigationTooltips：['firstSlide'，'secondSlide']`。 如果您愿意，也可以在每个部分中使用属性 `data-tooltip` 来定义它们。\r\n\r\n### showActiveTooltip\r\n（默认为 `false`）在显示垂直导航中主动显提示。\r\n\r\n### slidesNavigation\r\n（默认为 `false`）如果设置为 `true` ，则会显示一个导航栏，该导航栏由站点上每个横向滑块的小圆圈组成。\r\n\r\n### slidesNavPosition\r\n（默认`bottom`）定义滑块的横向导航栏的位置。 值为 `top` 和 `bottom` 。 您可能需要修改 CSS 样式以确定从顶部或底部距离以及任何其他样式（如颜色）。\r\n\r\n### scrollOverflow\r\n（默认为 `true`）定义在内容大于它的高度的情况下是否为 section/slide 创建滚动。 It requires the default value `scrollBar: false`。 为了防止 fullpage.js 在某些 section 或 slide 中创建滚动条，请使用 `fp-noscroll` 类。 例如： `<div class=\"section fp-noscroll\">`. 在 section 元素中使用 `fp-auto-height-responsive` 时，您也可以防止 scrolloverflow 应用于响应模式。\r\n\r\n### scrollOverflowMacStyle\r\n（默认 `false`）. When active, this option will use a \"mac style\" for the scrollbar instead of the default one, which will look quite different in Windows computers. (translation needed)\r\n\r\n### scrollOverflowReset\r\n（默认`false`）[fullpage.js 的扩展](https://alvarotrigo.com/fullPage/extensions/)。 如果设置为 `true` ，当离开另一个垂直 section时，将使用滚动条向上滚动 section/slide 的内容。 这样，即使从 section 的下方滚动，section/slide 也会始终显示其内容的开头。 Possible values are `true`, `false`, `sections`, `slides`.Adding the class `fp-no-scrollOverflowReset` on the section or slide will disable this feature for that specific panel.\r\n\r\n### sectionSelector\r\n（默认`.section`）定义用于插件部分的 Javascript 选择器。 有时可能需要更改，以避免与使用与 fullpage.js 相同的选择器的其他插件的问题。\r\n\r\n### slideSelector\r\n（默认`.slide`）定义用于插件 slide 的 Javascript 选择器。 有时可能需要更改，以避免与使用与 fullpage.js 相同的选择器的其他插件的问题。\r\n\r\n### responsiveWidth\r\n（默认`0`）一个正常的滚动（`autoScrolling：false`）将在定义的宽度下以像素为单位使用。 如果用户希望将自己的响应式 CSS 用于 body 标记，则会将 `fp-responsive` 类别添加到 body 标记中。 例如，如果设置为 900，则每当浏览器的宽度小于 900 时，插件将像正常站点一样滚动。\r\n\r\n### responsiveHeight\r\n（默认 `0` ）一个正常的滚动（`autoScrolling：false`）将在定义的高度下以像素为单位使用。 如果用户希望将自己的响应式 CSS 用于 body 标记，则会将 `fp-responsive` 类添加到 body 标记中。 例如，如果设置为 900 ，则每当浏览器的高度小于 900 时，插件将像正常站点一样滚动。\r\n\r\n### responsiveSlides\r\n（默认`false`）[fullpage.js 的扩展](https://alvarotrigo.com/fullPage/extensions/)。 设置为`true`时，在响应模式被触发时，slide 将变成垂直 section。 （通过使用上面详述的 `responsiveWidth` 或 `responsiveHeight` 选项）。 需要fullpage.js> = 3.0.1。\r\n\r\n### cinematic\r\n\r\n（默认值 `false`）[fullpage.js 扩展](https://alvarotrigo.com/fullPage/extensions/cinematic.html)。启用或禁用各个 section 的滑动效果。需要 fullpage.js >= 4.0.41。\r\n\r\n### cinematicOptions\r\n\r\n（默认值：`{Object}`）允许在使用 `cinematic:true` 选项时配置内容动画的参数。[了解更多](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cinematic-Effects#cinematicoptions)。\r\n\r\n### effects\r\n（默认值： `false`）[fullpage.js 扩展功能](https://alvarotrigo.com/fullPage/extensions/slider-effects.html)。启用或禁用 section 的滑动效果。需要 fullpage.js >= 4.0.35\r\n\r\n### effectsOptions\r\n（默认值：`{Object}`，使用 [\"focus\" 预设](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#20-available-presetss)）。  \r\n启用 `effects:true` 时，用于配置效果参数。[了解如何应用 effects 选项](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#effects-options-documentation)\r\n\r\n\r\n### parallax\r\n（默认 `false` ）[fullpage.js 的扩展](https://alvarotrigo.com/fullPage/extensions/)。 定义是否在 section/slide 上使用视差背景效果。 [详细了解如何应用视差选项](https://github.com/alvarotrigo/fullPage.js/blob/master/lang/chinese/parallax-extension.md).\r\n\r\n### parallaxOptions\r\n（默认：`{type：'reveal'，percent：62，property：'translate'}`）。\r\n允许在使用选项 parallax:true 时配置视差背景效果的参数。 [详细了解如何应用视差选项](https://github.com/alvarotrigo/fullPage.js/blob/master/lang/chinese/parallax-extension.md).\r\n\r\n\r\n### dropEffect\r\n（默认： `false`） [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Defines whether or not to use the drop effect on sections / slides. [Read more about how to apply the the drop effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect).\r\n\r\n### dropEffectOptions\r\n（默认： `{ speed: 2300, color: '#F82F4D', zIndex: 9999}`）. \r\nAllows to configure the parameters for the drop effect when using the option `dropEffect:true`.[Read more about how to apply the the drop effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect).\r\n\r\n### waterEffect\r\n（默认： `false`） [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Defines whether or not to use the water effect on sections / slides. [Read more about how to apply the the water effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect).\r\n\r\n### waterEffectOptions\r\n（默认：: `{ animateContent: true, animateOnMouseMove: true}`）. \r\nAllows to configure the parameters for the water effect when using the option `waterEffect:true`.[Read more about how to apply the the water effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect).\r\n\r\n### cards\r\n（默认： `false`） [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/) . 定义是否在 section/slide 上使用卡片效果。[了解有关如何应用卡片选项的更多信息](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards).\r\n\r\n### cardsOptions\r\n（默认：: `{ perspective: 100, fadeContent: true, fadeBackground: true}`）. \r\n允许您在使用选项 `cards：true` 时配置卡片效果的参数。 [了解有关如何应用卡片选项的更多信息](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards).\r\n\r\n### lazyLoading\r\n（默认`true`）懒加载默认是激活的，这意味着它会延迟加载包含属性 `data-src` 的任何媒体元素，详见 [Lazy Loading docs](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E5%BB%B6%E8%BF%9F%E5%8A%A0%E8%BD%BD) 。 如果你想使用任何其他的后加载库，你可以禁用这个 fullpage.js 功能。\r\n\r\n### lazyLoadThreshold\r\n（默认值为 `0`）指定相对于当前部分，应该延迟加载的相邻垂直部分和水平幻灯片的媒体元素数量。使用一个数字来指定应该预加载多少前一个和下一个部分或幻灯片。\r\n\r\n### observer\r\n（默认： `true`） Defines whether or not to observe changes in the HTML structure of the page. When enabled, fullPage.js will automatically react to those changes and update itself accordingly. Ideal when adding, removing or hidding sections or slides. (translation needed)\r\n\r\n### credits\r\n（默认： `{enabled: true, label: 'Made with fullpage.js', position: 'right'}`）. \r\n\r\nDefines whether to use fullPage.js credits. As per clause 0, 4, 5 and 7 of the GPLv3 licecense, those using fullPage.js under the GPLv3 are required to give prominent notice that fullPage.js is in use. We recommend including attribution by keeping this option enabled. (translation needed)）. **注意**: 此选项需要一个有效的 `licenseKey` 值。\r\n\r\n## 公共方法\r\n你可以在[这里](https://alvarotrigo.com/fullPage/examples/methods.html)看到它们\r\n\r\n### getActiveSection()\r\n[示例](https://codepen.io/alvarotrigo/pen/VdpzRN/) 获取包含激活 section 及其属性的对象（键入[ Section ](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese#callbacks））。\r\n\r\n```javascript\r\nfullpage_api.getActiveSection();\r\n```\r\n\r\n### getActiveSlide()\r\n[示例](https://codepen.io/alvarotrigo/pen/VdpzRN/)  获取包含激活滑块及其属性的对象（键入[ Slide ](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese#callbacks））。）。\r\n\r\n```javascript\r\nfullpage_api.getActiveSlide();\r\n```\r\n\r\n### getScrollY() & getScrollX\r\n[Demo](https://codepen.io/alvarotrigo/pen/GRyGqro) `getScrollY` Gets the Y position of the fullPage wrapper. `getScrollX` gets the X position of the active horizontal slide.\r\n\r\n```javascript\r\nfullpage_api.getScrollY();\r\nfullpage_api.getScrollX();\r\n```\r\n\r\n### moveSectionUp()\r\n[示例](https://codepen.io/alvarotrigo/pen/GJXNMN) 向上滚动一个 section：\r\n\r\n```javascript\r\nfullpage_api.moveSectionUp();\r\n```\r\n---\r\n### moveSectionDown()\r\n[示例](https://codepen.io/alvarotrigo/pen/jPvVZx) 向下滚动一个 section：\r\n\r\n```javascript\r\nfullpage_api.moveSectionDown();\r\n```\r\n---\r\n### moveTo(section, slide)\r\n[示例](https://codepen.io/alvarotrigo/pen/doqOmY) 将页面滚动到目标 section 和滑动。section 从 1 开始，slide 从 0 开始。\r\n\r\n```javascript\r\n/*滚动到锚链接`firstSlide`和为2的slide */\r\nfullpage_api.moveTo('firstSlide', 2);\r\n\r\n```\r\n\r\n```javascript\r\n//滚动到网站的第三个section\r\nfullpage_api.moveTo(3, 0);\r\n\r\n//这是一样的\r\nfullpage_api.moveTo(3);\r\n```\r\n---\r\n### silentMoveTo(section, slide)\r\n[示例](https://codepen.io/alvarotrigo/pen/doqOeY) 与 [`moveTo`](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#moveto%E7%AC%AC%E8%8A%82-%E5%B9%BB%E7%81%AF%E7%89%87) 完全相同，但是在这种情况下，它将执行没有动画的滚动。 直接跳到目的地。\r\n\r\n```javascript\r\n/*滚动到锚链接 firstSlide 和第二个 slide 的部分 */\r\nfullpage_api.silentMoveTo('firstSlide', 2);\r\n```\r\n---\r\n### moveSlideRight()\r\n[示例](https://codepen.io/alvarotrigo/pen/Wvgoyz) 将当前 slide 的水平滑块滚动到下一张 slide ：\r\n\r\n```javascript\r\nfullpage_api.moveSlideRight();\r\n```\r\n---\r\n### moveSlideLeft()\r\n[示例](https://codepen.io/alvarotrigo/pen/gpdLjW) 将当前 slide 的水平滑块滚动到上一张 slide :\r\n\r\n```javascript\r\nfullpage_api.moveSlideLeft();\r\n```\r\n---\r\n### setAutoScrolling(boolean)\r\n[示例](https://codepen.io/alvarotrigo/pen/rVZWrR) 动态设置 autoScrolling 。\r\n定义页面滚动行为的方式。 如果设置为 `true`，则将使用\"自动\"滚动，否则将使用站点的\"手动\"或\"正常\"滚动。\r\n\r\n```javascript\r\nfullpage_api.setAutoScrolling(false);\r\n```\r\n---\r\n### setFitToSection(boolean)\r\n[示例](https://codepen.io/alvarotrigo/pen/GJXNYm) 设置选项 `fitToSection` 的值，确定是否自适应 section 在屏幕上。\r\n\r\n\r\n```JavaScript\r\nfullpage_api.setFitToSection(false);\r\n```\r\n---\r\n### fitToSection()\r\n[示例](https://codepen.io/alvarotrigo/pen/JWWagj) 滚动到最接近视图中的激活 section。\r\n\r\n```javascript\r\nfullpage_api.fitToSection();\r\n```\r\n---\r\n### setLockAnchors(boolean)\r\n[示例](https://codepen.io/alvarotrigo/pen/yNxVRQ) 设置选项 `lockAnchors` 的值，以确定锚是否在 URL 中有影响。\r\n\r\n```javascript\r\nfullpage_api.setLockAnchors(false);\r\n```\r\n---\r\n### setAllowScrolling(boolean, [directions])\r\n[示例](https://codepen.io/alvarotrigo/pen/EjeNdq) 添加或者禁止 fullpage 自动绑定的鼠标滑轮和移动触摸事件。 注意这不会禁用键盘滚动。 您将需要使用`setKeyboardScrolling` 。\r\n\r\n- `directions`：（可选参数）允许的值：`all`，`up`，`down`，`left`，`right` 或者设置组合参数，例如`down，right` 等逗号分隔。 它定义了启用或禁用滚动的方向。\r\n\r\n```javascript\r\n\r\n//禁用滚动\r\nfullpage_api.setAllowScrolling(false);\r\n\r\n//禁用向下滚动\r\nfullpage_api.setAllowScrolling(false, 'down');\r\n\r\n//禁用向下和向右滚动\r\nfullpage_api.setAllowScrolling(false, 'down, right');\r\n```\r\n---\r\n### setKeyboardScrolling(boolean, [directions])\r\n[示例](https://codepen.io/alvarotrigo/pen/GJXNwm) 添加或者禁止键盘对 section/slide 的控制（默认绑定）。\r\n\r\n- `directions`: （可选参数）允许的值：`all`，`up`，`down`，`left`，`right`或者它们的组合，用`down，right`等逗号分隔。 它定义了滚动将被启用或禁用的方向。\r\n\r\n```javascript\r\n//禁用所有键盘滚动\r\nfullpage_api.setKeyboardScrolling(false);\r\n\r\n//禁用键盘向下滚动\r\nfullpage_api.setKeyboardScrolling(false, 'down');\r\n\r\n//禁用键盘向下和向右滚动\r\nfullpage_api.setKeyboardScrolling(false, 'down, right');\r\n```\r\n---\r\n### setRecordHistory(boolean)\r\n[示例](https://codepen.io/alvarotrigo/pen/rVZWQb) 定义是否为每个URL的变更纪录到浏览器中的历史记录中。\r\n\r\n```javascript\r\nfullpage_api.setRecordHistory(false);\r\n```\r\n---\r\n### setScrollingSpeed(milliseconds)\r\n[示例](https://codepen.io/alvarotrigo/pen/NqLbeY) 定义以毫秒为单位的滚动速度。\r\n\r\n```javascript\r\nfullpage_api.setScrollingSpeed(700);\r\n```\r\n---\r\n### destroy(type)\r\n[示例](https://codepen.io/alvarotrigo/pen/bdxBzv) 销毁插件事件以及可选的 HTML 标记和样式。理想选择配合使用 AJAX 加载内容时。\r\n\r\n- `type`: （可选参数）可以为空或 `all` 。 如果 `all` 被传递，fullpage.js 使用的 HTML 标记和样式将被删除。 这样，原始的 HTML 标记，将使用插件修改之前使用的标记。\r\n\r\n```javascript\r\n//销毁由fullPage.js创建的所有Javascript事件（滚动,以变动的URL...）\r\nfullpage_api.destroy();\r\n\r\n//销毁所有的JavaScript事件，以及在原始HTML标记中由fullPage.js所做的任何修改。\r\nfullpage_api.destroy('all');\r\n```\r\n---\r\n### reBuild()\r\n更新 DOM 结构以适应新的窗口大小或其内容。\r\n非常适合与 AJAX 调用或站点的 DOM 结构中的外部更改结合使用，特别是在使用 `scrollOverflow：true` 时。\r\n\r\n```javascript\r\nfullpage_api.reBuild();\r\n```\r\n---\r\n### setResponsive(boolean)\r\n[示例](https://codepen.io/alvarotrigo/pen/WxOyLA) 设置页面的响应模式。 当设置为 `true` 时，自动滚动将被关闭，结果与 `responsiveWidth` 或`responsiveHeight` 选项被触发时的结果完全相同。\r\n\r\n```javascript\r\nfullpage_api.setResponsive(true);\r\n```\r\n---\r\n### responsiveSlides.toSections()\r\n[fullpage.js 的扩展](https://alvarotrigo.com/fullPage/extensions/)。 需要 fullpage.js> = 3.0.1。将水平 slide 变成垂直 section。\r\n\r\n```javascript\r\nfullpage_api.responsiveSlides.toSections();\r\n```\r\n---\r\n### responsiveSlides.toSlides()\r\n[fullpage.js的扩展](https://alvarotrigo.com/fullPage/extensions/)。 需要 fullpage.js> = 3.0.1 。将原始 slide（现转换为垂直 section）重新转换为水平 slide。\r\n\r\n```javascript\r\nfullpage_api.responsiveSlides.toSlides();\r\n```\r\n\r\n## 回调函数\r\n[示例](https://codepen.io/alvarotrigo/pen/XbPNQv) 你可以在 [这里](https://alvarotrigo.com/fullPage/examples/callbacks.html) 看到他们。\r\n\r\n一些回调，例如 `onLeave` 将包含 `Section` 或 `Slide` 类型的参数。 这些对象将包含以下属性：\r\n- `anchor`: *(String)* 项目的 anchorLink。\r\n- `index`: *(Number)* 项目的 index。\r\n- `item`: *(DOM element)* 项目元素。\r\n- `isFirst`: *(Boolean)* 判断游标是否在第一行。\r\n- `isLast`: *(Boolean)* 判断游标是否在最后一行。\r\n\r\n### afterLoad (`origin`, `destination`, `direction` ,`trigger`)\r\n滚动结束之后，一旦加载了 section ，就会触发回调。参数：\r\n\r\n- `origin`: *(Object)* 前置 section\r\n- `destination`: *(Object)* 目标 section。\r\n- `direction`: *(String)* 它将根据滚动方向 `up` 或 `down` 取值。\r\n\r\n例如：\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\r\n\r\n\tafterLoad: function(origin, destination, direction, trigger){\r\n\t\tvar origin = this;\r\n\r\n\t\t//使用 index\r\n\t\tif(origin.index == 2){\r\n\t\t\talert(\"第3个section停止加载\");\r\n\t\t}\r\n\r\n\t\t//使用 anchorLink\r\n\t\tif(origin.anchor == 'secondSlide'){\r\n\t\t\talert(\"第2个section停止加载\");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n---\r\n### onLeave (`origin`, `destination`, `direction`, `trigger`)\r\n一旦用户离开 section ，过渡到新 section ，就会触发此回调。\r\n返回 “false” 将在移动发生之前取消移动。\r\n\r\n参数：\r\n\r\n- `origin`:  *(Object)* 前置 section\r\n- `destination`: *(Object)* 目标 section。\r\n- `direction`: *(String)* 它将根据滚动方向 `up` 或 `down` 取值。\r\n\r\n例如：\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tonLeave: function(origin, destination, direction, trigger){\r\n\t\tvar origin = this;\r\n\r\n\t\t//离开第二个section后\r\n\t\tif(origin.index == 1 && direction =='down'){\r\n\t\t\talert(\"前往第3个section！\");\r\n\t\t}\r\n\r\n\t\telse if(origin.index == 1 && direction == 'up'){\r\n\t\t\talert(\"前往第1个section！\");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n\r\n---\r\n### beforeLeave (`origin`, `destination`, `direction`, `trigger`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback is fired right **before** leaving the section, just before the transition takes place.\r\n\r\nYou can use this callback to prevent and cancel the scroll before it takes place by returning `false`.\r\n\r\nParameters:\r\n\r\n- `origin`:  *(Object)* section of origin.\r\n- `destination`: *(Object)* destination section.\r\n- `direction`: *(String)* it will take the values `up` or `down` depending on the scrolling direction.\r\n- `trigger`: *(String)* indicates what triggered the scroll. It can be: \"wheel\", \"keydown\", \"menu\", \"slideArrow\", \"verticalNav\", \"horizontalNav\".\r\n\r\nExample:\r\n\r\n```javascript\r\n\r\nvar cont = 0;\r\nnew fullpage('#fullpage', {\r\n\tbeforeLeave: function(origin, destination, direction, trigger){\r\n\r\n\t\t// prevents scroll until we scroll 4 times\r\n\t\tcont++;\r\n\t\treturn cont === 4;\r\n\t}\r\n});\r\n```\r\n\r\n---\r\n### afterRender()\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) 这个回调在页面结构生成后立即被触发。 这是您要用来初始化其他插件的回调函数，或者触发任何需要 DOM 准备就绪的代码（因为这个插件修改了 DOM 来创建最终的结构）。 请参阅 [常见问题](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions) 了解更多信息。\r\n\r\n例如：\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterRender: function(){\r\n\t\tvar pluginContainer = this;\r\n\t\talert(\"DOM结构已完成\");\r\n\t}\r\n});\r\n```\r\n---\r\n### afterResize(`width`, `height`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) 调整浏览器窗口大小后，会触发此回调。 就在 section 被调整之后。\r\n\r\n参数：\r\n\r\n- `width`:  *(Number)* 屏幕宽度。\r\n- `height`: *(Number)* 屏幕高度。\r\n\r\n例如：\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterResize: function(width, height){\r\n\t\tvar pluginContainer = this;\r\n\t\talert(\"section已重新调整大小\");\r\n\t}\r\n});\r\n```\r\n---\r\n### afterReBuild()\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) 通过调用 `fullpage_api.reBuild（）` 手动重新构建 fullpage.js 后，将触发此回调。\r\n\r\n例如：\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterReBuild: function(){\r\n\t\tconsole.log(\"fullPage.js has manually being re-builded\");\r\n\t}\r\n});\r\n```\r\n---\r\n### afterResponsive(`isResponsive`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) 在 fullpage.js 从正常模式变为响应模式或从响应模式变为正常模式之后，此回调将被触发。\r\n\r\n参数：\r\n\r\n- `isResponsive`：*(Boolean)* 布尔值，用于确定是否进入响应模式（ `true` ）或返回正常模式（ `false` ）。\r\n\r\n例如：\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterResponsive: function(isResponsive){\r\n\t\talert(\"是否响应\" + isResponsive);\r\n\t}\r\n});\r\n```\r\n---\r\n### afterSlideLoad (`section`, `origin`, `destination`, `direction`, `trigger`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) 滚动结束后，加载一个 section 的 slide 后触发回调。\r\n\r\n参数：\r\n\r\n- `section`: *(Object)* 垂直方向激活的 section。\r\n- `origin`: *(Object)* 水平方向的前置 slide。\r\n- `destination`: *(Object)* 水平方向的 slide。\r\n- `direction`: *(String)* 它将根据滚动方向 `right` 或 `left` 取值。\r\n\r\n例如：\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\r\n\r\n\tafterSlideLoad: function( section, origin, destination, direction, trigger){\r\n\t\tvar loadedSlide = this;\r\n\r\n\t\t//第二个section的第一个slide\r\n\t\tif(section.anchor == 'secondPage' && destination.index == 1){\r\n\t\t\talert(\"第一张slide加载完毕\");\r\n\t\t}\r\n\r\n\t\t//第二个section的第二个slide（假设#secondSlide是\r\n        //为第二个slide锚点\r\n\t\tif(section.index == 1 && destination.anchor == 'secondSlide'){\r\n\t\t\talert(\"第二slide加载完毕\");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n\r\n---\r\n### onSlideLeave (`section`, `origin`, `destination`, `direction`, `trigger`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) 一旦用户离开 slide 转到另一个 slide ，就会触发此回调。返回 `false` 将在移动发生之前取消移动。\r\n\r\n参数：\r\n\r\n- `section`: *(Object)* 垂直方向激活的 section.\r\n- `origin`: *(Object)* 水平方向的前置 slide.\r\n- `destination`: *(Object)* 水平方向的目标 slide.\r\n- `direction`: *(String)* 它将根据滚动方向 `right`  或 `left` 取值。\r\n\r\n\r\n例如：\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tonSlideLeave: function( section, origin, destination, direction, trigger){\r\n\t\tvar leavingSlide = this;\r\n\r\n\t\t//留下第二个section的第一个slide\r\n\t\tif(section.index == 1 && origin.index == 0 && direction == 'right'){\r\n\t\t\talert(\"离开第一个slide！\");\r\n\t\t}\r\n\r\n\t\t//将第二个section的第三个slide留在左边\r\n\t\tif(section.index == 1 && origin.index == 2 && direction == 'left'){\r\n\t\t\talert(\"前往第二个slide！\");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n\r\n#### 在发生移动之前取消移动\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) 您可以通过在 `onSlideLeave` 回调中返回 `false` 来取消移动。 [与使用 `onLeave` 取消动作一样](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese/#%E8%A7%A6%E5%8F%91%E4%B9%8B%E5%89%8D%E5%8F%96%E6%B6%88%E6%BB%9A%E5%8A%A8)。\r\n\r\n\r\n---\r\n### onScrollOverflow (`section`, `slide`, `position`, `direction`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback gets fired when a scrolling inside a scrollable section when using the fullPage.js option `scrollOverflow: true`.\r\n\r\nParameters:\r\n\r\n- `section`: *(Object)* active vertical section.\r\n- `slide`: *(Object)* horizontal slide of origin.\r\n- `position`: *(Integer)* scrolled amount within the section/slide. Starts on 0.\r\n- `direction`: *(String)* `up` or `down`\r\n\r\nExample:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tonScrollOverflow: function( section, slide, position, direction){\r\n\t\tconsole.log(section);\r\n\t\tconsole.log(\"position: \" + position);\r\n\t}\r\n});\r\n```\r\n\r\n# 问题反馈\r\n1. 请在提问之前使用 [issue](https://github.com/alvarotrigo/fullPage.js/issues) 搜索查找您的问题。\r\n2. 确保使用最新的 fullpage.js 版本，不支持旧版本。\r\n3. 使用 [Github 问题论坛](https://github.com/alvarotrigo/fullPage.js/issues) 来创建问题。\r\n4. **对问题进行复现** 如果可以，请使用 [jsfiddle](https://jsfiddle.net/alvarotrigo/ea17skjr/) 或 [codepen](https://codepen.io/alvarotrigo/pen/qqabrp) 。\r\n\r\n# 贡献到 fullpage.js\r\n请参阅 [贡献到 fullpage.js](https://github.com/alvarotrigo/fullPage.js/wiki/Contributing-to-fullpage.js) \r\n\r\n# 更新日志\r\n要查看最近更改的列表，请参见 [发行版部分](https://github.com/alvarotrigo/fullPage.js/releases) .\r\n\r\n# 编译构建\r\n想要构建 fullpage.js 分发文件？ 请参阅 [Build Tasks](https://github.com/alvarotrigo/fullPage.js/wiki/Build-tasks) \r\n\r\n# 参考资源\r\n- Wordpress Plugin [for Gutenberg](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/) and [for Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/).\r\n- [Wordpress theme](https://alvarotrigo.com/fullPage/utils/wordpress.html)\r\n- [Official Vue.js wrapper component](https://github.com/alvarotrigo/vue-fullpage.js)\r\n- [Official React.js wrapper component](https://github.com/alvarotrigo/react-fullpage)\r\n- [Official Angular wrapper component](https://github.com/alvarotrigo/angular-fullpage)\r\n- [CSS Easing Animation Tool - Matthew Lein](https://matthewlein.com/ceaser/) (用于定义 `easingcss3` 的值)\r\n- [fullPage.js jsDelivr CDN](https://www.jsdelivr.com/package/npm/fullpage.js)\r\n- [fullPage.js plugin for October CMS](https://github.com/freestream/oc-parallax-plugin)\r\n- [fullPage.js wordpress plugin](https://wordpress.org/plugins/wp-fullpage/)\r\n- [fullPage.js Angular2 directive](https://github.com/meiblorn/ng2-fullpage)\r\n- [fullPage.js angular directive](https://github.com/hellsan631/angular-fullpage.js)\r\n- [fullPage.js ember-cli addon](https://www.npmjs.com/package/ember-cli-fullpagejs)\r\n- [fullPage.js Rails Ruby Gem](https://rubygems.org/gems/fullpagejs-rails)\r\n- [Angular fullPage.js - Adaptation for Angular.js v1.x](https://github.com/mmautomatizacion/angular-fullpage.js)\r\n- [Integrating fullPage.js with Wordpress (Tutorial)](https://premium.wpmudev.org/blog/build-apple-inspired-full-page-scrolling-pages-for-your-wordpress-site/)\r\n\r\n## 谁在使用 fullPage.js\r\n\r\n![Who is using fullPage.js](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/using-fullpage.png)\r\n\r\n- http://www.bbc.co.uk/news/resources/idt-d88680d1-26f2-4863-be95-83298fd01e02\r\n- http://medoff.ua/en/\r\n- http://promo.prestigio.com/grace1/\r\n- http://torchbrowser.com/\r\n- http://www.boxreload.com/\r\n- http://boxx.hk/\r\n- http://www.villareginateodolinda.it\r\n\r\n## Sponsors\r\n成为赞助商，您的徽标将出现在我们的 GitHub README 中，并附带到您网站的链接。[[联系我们](https://alvarotrigo.com/#contact)] | [[成为 Patreon]](https://www.patreon.com/fullpagejs) | [成为 GitHub 赞助商](https://github.com/sponsors/alvarotrigo)\r\n\r\n\r\n[![Warp](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/warp.png)](http://go.warp.dev/fullPage)\r\n[![Crawlbase](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/crawlbase.png)](https://crawlbase.com/?utm_source=github&utm_medium=sponsor&utm_campaign=fullpagejs)\r\n[![TestMu](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/testmu-ai.png)](https://www.testmu.com/?utm_source=fullpagejs&utm_medium=sponsor)\r\n[![Codeless](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codeless.png)](https://codeless.co)\r\n[![Stackpath](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/stackpath3.png)](https://www.stackpath.com/)\r\n[![Browserstack](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/browserstack3.png)](http://www.browserstack.com/)\r\n[![CodePen](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codepen3.png)](https://codepen.com)\r\n\r\n### People\r\n<a href=\"https://github.com/donsalvadori\" target=\"_blank\" rel=\"nofollow\">\r\n\t<img src=\"http://wallpapers-for-ipad.com/fullpage/imgs3/avatars/donsalvadori.jpg\">\r\n</a>\r\n\r\n\r\n## Contributors\r\n\r\n<a href=\"https://github.com/alvarotrigo/fullPage.js/graphs/contributors\">\r\n  <img src=\"https://contrib.rocks/image?repo=alvarotrigo/fullPage.js&max=400&columns=25&anon=1&v=2\" />\r\n</a>\r\n"
  },
  {
    "path": "lang/chinese/how-to-activate-fullpage-extension.md",
    "content": "# 如何激活fullPage.js扩展\r\n\r\n1. 访问 https://alvarotrigo.com/fullPage/extensions/activationKey.html. (当购买扩展时，此链接会发送到你的邮箱中)\r\n1. 介绍在购买物品时给予您的**许可证密钥**。也可以在您的购买确认邮件中找到。\r\n1. 可能需要域名才能获取产品的**激活密钥**。\r\n1. 拿到扩展和域的激活密钥（在前面的步骤中生成）后，你需要在fullpage.js初始化中添加一个选项，其形式为`nameOfExtension + \"Key\": key`。\r\n\r\n例如：\r\n\r\n```javascript\r\nvar myFullpage = new fullpage('#fullpage', {\r\n    fadingEffect: true,\r\n    fadingEffectKey: '激活密钥应在这里',\r\n});\r\n```\r\n\r\n如果您已使用扩展，则其余的扩展名也是如此。\r\n以下是目前所有的扩展关键字选项：\r\n\r\n* `fadingEffectKey`\r\n* `responsiveSlidesKey`\r\n* `continuousHorizontalKey`\r\n* `interlockedSlidesKey`\r\n* `scrollHorizontallyKey`\r\n* `resetSlidersKey`\r\n* `offsetSectionsKey`\r\n* `dragAndMoveKey`\r\n* `parallaxKey`\r\n* `cardsKey`\r\n\r\n请记住，如[扩展的使用](https://github.com/alvarotrigo/fullPage.js#use-extensions)[]中所介绍的，使用扩展需要调用[`fullpage.extensions.min.js`](https://github.com/alvarotrigo/fullPage.js/blob/master/dist/fullpage.extensions.min.js)，而不像平常的fullPage.js文件（`fullpage.js`）那样使用扩展。\r\n\r\n### What to do for development environments / websites?\r\nNo activation key is necessary for localhost and 127.0.0.1. Any other staging domains will require a license (Professional or Business) that allows to generate a new key for those.\r\n\r\nIf you have a license that allows you to generate multiple activation keys you might want to use the same JS code for all of them. In this case you can use an array with the different keys for each domain, for example, if we are using the `scrollHorizontally` extension for 3 domains, we can do the following:\r\n\r\n```js\r\nnew fullPage('#fullpage', {\r\n    scrollHorizontally: true,\r\n    scrollHorizontallyKey: ['domain1_key', 'domain2_key', 'domain3_key'] \r\n});\r\n```\r\n\r\nThis way the extension can be used in any of those 3 domains.\r\n\r\n### 许可证密钥与激活密钥\r\n两者是不同的密钥。\r\n- 购买任何扩展程序时，您将获得**许可证密钥**。\r\n- 激活特定域的扩展时，您将获得**激活密钥** （除非使用“无限许可证”）。 生成**激活密钥**需要**许可证密钥**。\r\n\r\n许可证密钥由4组字符组成，每组字符为8个字符(`XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX`)。激活密钥的长度可变，且不是由分隔的字符组组成(`XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`)。不要将两者混淆。"
  },
  {
    "path": "lang/chinese/parallax-extensionmd.md",
    "content": "# 视差扩展\r\n\r\n![](https://cloud.githubusercontent.com/assets/1706326/23580315/f28edab4-00f6-11e7-90f9-81ffafd77b0e.gif)\r\n\r\n使用视差选项前请先阅读 [扩展的使用](https://github.com/alvarotrigo/fullPage.js/tree/dev/lang/chinese#%E4%BD%BF%E7%94%A8%E6%89%A9%E5%B1%95)。\r\n- [展示例子](http://alvarotrigo.com/fullPage/extensions/parallax.html)\r\n- [要求 HTML 结构](#html)\r\n- [应用背景](#%E5%BA%94%E7%94%A8%E8%83%8C%E6%99%AF)\r\n- [选项](#%E9%80%89%E9%A1%B9)\r\n  - [视差效果选项](#%E8%A7%86%E5%B7%AE%E6%95%88%E6%9E%9C%E9%80%89%E9%A1%B9)\r\n- [方法](#%E6%96%B9%E6%B3%95)\r\n\r\n## HTML\r\n为了在代码段和幻灯片中使用视差效果，必须将一个空`div`新元素添加到类`fp-bg`中，作为该代码段或幻灯片的第一个子段。 如下所示：\r\n\r\n```html\r\n<div class=\"fp-bg\"></div>\r\n```\r\n\r\n这是您必须应用在背景中的元素，而不是其所属的代码段或幻灯片。\r\n\r\n例如：\r\n```html\r\n<div id=\"fullpage\">\r\n    <div class=\"section\" id=\"section1\">\r\n        <div class=\"fp-bg\"></div>\r\n        幻灯片 1.1\r\n    </div>\r\n    <div class=\"section\" id=\"section2\">\r\n        <div class=\"slide\" id=\"slide2-1\">\r\n            <div class=\"fp-bg\"></div>\r\n            幻灯片  2.1\r\n        </div>\r\n        <div class=\"slide\" id=\"slide2-2\">\r\n            <div class=\"fp-bg\"></div>\r\n            幻灯片 2.2\r\n        </div>\r\n    </div>\r\n</div>\r\n```\r\n\r\n这个结构可以在[视差演示页面](http://alvarotrigo.com/fullPage/extensions/parallax.html)的源代码中看到。\r\n\r\n> 如果出于其他原因，您真的不想在布局中添加新元素，则可以将`parallaxOptions`中的选项`property`设置为`background`，以便将效果应用于当前段落或幻灯片背景。\r\n> 正如“视差效果选项”中所解释的，如果真的有必要，我只推荐这样做，因为性能不会像使用`fp-bg`元素时那样。\r\n\r\n\r\n## 应用背景\r\n应用于`fp-bg`元素的背景应与将其应用于段落或幻灯片的方式相同。\r\n您可以使用CSS或内联样式。\r\n\r\n例如：\r\n```css\r\n#section1 .fp-bg{\r\n    background-image: url('imgs/alvaro-genious.jpg');\r\n    background-size: cover;\r\n    background-position: center 80%;\r\n}\r\n```\r\n## 选项\r\n\r\n| 选项  | 说明 |\r\n| ------------- | ------------- |\r\n| **parallax**  | (默认为 `false`). [fullPage.js的扩展。](http://alvarotrigo.com/fullPage/extensions/). 定义是否在段落/幻灯片上使用视差背景效果。Possible values are false, true, sections, slides.  |\r\n| **parallaxOptions:**   | (默认： `{ type: 'reveal', percentage: 62, property: 'translate'}`). 当使用选项`parallax:true`时，表示允许配置视差背景效果的参数  |\r\n\r\n\r\n### 视差效果选项\r\n可以在[演示页面](http://alvarotrigo.com/fullPage/extensions/parallax.html)看到运行效果\r\n\r\n\r\n在选项`parallaxOptions`中可用的可配置选项说明：\r\n\r\n| parallaxOptions  | 描述 |\r\n| ------------- | ------------- |\r\n| **type**  | (默认 `reveal`) 可用值是`cover`和`reveal`。提供选择当前段落/幻灯片是高于还是低于目标页面的方法。当使用`cover`时，下一段落或幻灯片将会覆盖当前的部分页面。使用`reveal`仅是反转的效果，并在显示时覆盖了小部分目标页面 |\r\n| **percentage**  | (默认值 62 ) 提供一种方法来定义与视口相关的视差效果的百分比。数值越小，视差效果越小，而最大值为100的图像则为完全静态的背景。   |\r\n| **property** | 定义我们是否要将视差效果应用于`fp-bg`元素，或者直接应用于段落或幻灯片的背景属性。建议使用此选项的默认值。|\r\n\r\n请注意，使用`fp-bg`元素可以获得更好的性能，因为它利用了translate3d硬件加速。该选项适用于那些由于某种原因不想在每个段落或幻灯片中添加额外的`fp-bg`元素或无法修改HTML标记的人。\r\n\r\n## 方法\r\n可以在[演示页面](http://alvarotrigo.com/fullPage/extensions/parallax.html)查看运行效果。\r\n\r\n### setOption(optionName, value)\r\n为给定选项设一个值。`optionName` 可以是`parallaxOptions`中的任意选项 (`type`, `percentage` 或 `property`).\r\n```javascript\r\n//改变属性`type`的值\r\nfullpage_api.parallax.setOption('type', 'cover');\r\n\r\n//改变属性`percentage`的值\r\nfullpage_api.parallax.setOption('percentage', '30');\r\n```\r\n---\r\n\r\n### init()\r\n启用视差效果。如果您需要在某个特定时间点动态启用该功能，可以调用这个方法。\r\n```javascript\r\nfullpage_api.parallax.init();\r\n```\r\n---\r\n### destroy()\r\n关闭视差效果。\r\n```javascript\r\nfullpage_api.parallax.destroy();\r\n```\r\n"
  },
  {
    "path": "lang/french/README.md",
    "content": "# fullPage.js\n![preview](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/intro.png)\n![compatibility](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/compatible.png)\n\n<p align=\"center\">\n  <a href=\"https://github.com/alvarotrigo/fullPage.js\">English</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish#fullpagejs\">Español</a> |\n  <span>Français</span> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian#fullpagejs\">Pусский</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese#fullpagejs\">中文</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#fullpagejs\">한국어</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese#fullpagejs\"> 日本語</a> | \n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese#fullpagejs\">Português Brasileiro</a>\n</p>\n\n<p align=\"center\">\n\tDisponible pour <a href=\"https://github.com/alvarotrigo/vue-fullpage.js\">Vue</a>, <a href=\"https://github.com/alvarotrigo/react-fullpage\">React</a> et <a href=\"https://github.com/alvarotrigo/angular-fullpage\">Angular</a>.\n</p>\n\n---\n\n![fullPage.js version](https://img.shields.io/badge/fullPage.js-v4.0.41-brightgreen.svg)\n[![License](https://img.shields.io/badge/License-GPL-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.html)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/fullpage.js/badge?style=rounded)](https://www.jsdelivr.com/package/npm/fullpage.js)\n[![Minzipped Size](https://img.shields.io/bundlephobia/minzip/fullpage.js)](https://bundlephobia.com/package/fullpage.js)\n&nbsp;&nbsp;**|**&nbsp;&nbsp; *Created by [@imac2](https://twitter.com/imac2)*\n\n- [Demo en ligne](https://alvarotrigo.com/fullPage/) | [Codepen](https://codepen.io/alvarotrigo/pen/qqabrp)\n- [Wordpress plugin for Gutenberg](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/) and [WordPress pluging fo Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/)\n- [Thème Wordpress](https://alvarotrigo.com/fullPage/utils/wordpress.html)\n- [Extensions fullpage.js](https://alvarotrigo.com/fullPage/extensions/)\n- [Questions fréquemment demandées](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions)\n- [[Migration from fullPage v3 to fullpage v4]](https://alvarotrigo.com/fullPage/help/migration-from-fullpage-3/)\n---\n\nUne bibliothèque simple et facile à utiliser pour créer des sites Web qui défile en plein écran (aussi connus sous le nom de sites web d'une seule page ou d'une page).\nElle permet la création de sites Web à défilement en plein écran, ainsi que l'ajout de quelques carousel panoramique à l'intérieur des sections du site.\n\n- [Introduction](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#introduction)\n- [Compatibilité](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#compatibilité)\n- [Licence](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#licence)\n- [Usage](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#usage)\n  - [Créer des liens vers des sections ou des diapositives](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#cr%C3%A9er-des-liens-vers-des-sections-ou-des-diapositives)\n  - [Créer des sections plus petites ou plus grandes](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#créer-des-sections-plus-petites-ou-plus-grandes)\n  - [Classes d'états ajoutées par fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#classes-d%C3%A9tats-ajout%C3%A9es-par-fullpagejs)\n  - [Lazy loading](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#lazy-loading)\n  - [Lecture automatique/pause automatique des médias intégrés](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#lecture-automatiquepause-automatique-des-médias-intégrés)\n  - [Utiliser des extensions](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#utiliser-des-extensions)\n- [Options](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#options)\n- [Méthodes](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#méthodes)\n- [Callbacks](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#callbacks)\n- [Signaler les problèmes](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#signaler-les-problèmes)\n- [Contribuer à fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#contribuer-à-fullpagejs)\n- [Changelog](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#changelog)\n- [Build tasks](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#build-tasks)\n- [Ressources](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#ressources)\n- [Qui utilise fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#qui-utilise-fullpagejs)\n- [Dons](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#dons)\n- [Sponsors](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#sponsors)\n\n## Introduction\nLes suggestions sont les bienvenues, non seulement pour les demandes de fonctionnalités mais aussi pour l'amélioration du style de codage.\nFaisons de cette bibliothèque une grande bibliothèque pour rendre la vie des gens plus facile !\n\n## Compatibilité\nfullPage.js est entièrement fonctionnel sur tous les navigateurs modernes & IE 11.\nIl fournit également un support tactile pour les téléphones mobiles, les tablettes et les ordinateurs à écran tactile.\n\nRemerciements particuliers à [Browserstack](https://www.browserstack.com/) pour son soutien à fullpage.js.\n\n## Licence\n\n### Licence commercial\nSi vous voulez utiliser fullPage pour développer des sites, thèmes, projets et applications non open-source, la licence commerciale est la licence appropriée. Avec cette option, votre code source reste propriétaire. Ce qui signifie que vous n'aurez pas à changer tout le code source de votre application pour une licence open source. [Achat d'une licence commerciale pleine page](https://alvarotrigo.com/fullPage/pricing/)\n\n### Licence open-source\nSi vous créez une application open source sous une licence compatible avec la [licence GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html), vous pouvez utiliser fullPage sous les termes de la GPLv3.\n\n**You will have to provide a prominent notice that fullPage.js is in use. Les commentaires de crédit dans les fichiers JavaScript et CSS doivent être conservés intacts.** (même après la combinaison ou la minification)\n\n[En savoir plus sur la licence de fullPage](https://alvarotrigo.com/fullPage/pricing/).\n\n## Usage\nComme vous pouvez le voir dans les fichiers d'exemple, vous devrez inclure :\n - Le fichier JavaScript `fullpage.js` (ou sa version minifié `fullpage.min.js`)\n - Le fichier css `fullpage.css`.\n\n **Optionnellement**, lorsque vous utilisez `css3:false`, vous pouvez ajouter le fichier [easings file](https://github.com/alvarotrigo/fullPage.js/tree/master/vendors/easings.min.js) au cas où vous voudriez utiliser d'autres effets d'assouplissement que celui inclus dans la bibliothèque (`easeInOutCubic`).\n\n #### Installer avec bower ou npm\n **En option**, vous pouvez installer fullPage.js avec bower ou npm si vous préférez :\n\n Terminal :\n ```shell\n // Avec bower\n bower install fullpage.js\n\n // Avec npm\n npm installer fullpage.js\n ```\n\n #### Y compris les fichiers :\n\n```html\n<link rel=\"stylesheet\" type=\"text/css\" href=\"fullpage.css\" />\n\n<!-- Cette ligne suivante est facultative. Seulement nécessaire si vous utilisez l'option css3:false et que vous voulez utiliser d'autres effets d'assouplissement plutôt que \"easeInOutCubic\". -->\n<script src=\"vendors/easings.min.js\"></script>\n\n<script type=\"text/javascript\" src=\"fullpage.js\"></script>\n```\n\n\nVous utilisez Webpack, Browserify ou Require.js ? Vérifiez [comment utiliser fullPage.js avec les chargeurs de modules](https://github.com/alvarotrigo/fullPage.js/wiki/Use-module-loaders-for-fullPage.js).\n\n### Utilisation facultative du CDN\nSi vous préférez utiliser un CDN pour charger les fichiers nécessaires, fullPage.js est dans [JSDelivr](https://www.jsdelivr.com/package/npm/fullpage.js), [UNPKG](https://unpkg.com/browse/fullpage.js/dist/), [CDNJS](https://cdnjs.com/libraries/fullPage.js)...\n\n### Structure HTML requise\nCommencez votre document HTML avec la déclaration obligatoire[déclaration DOCTYPE HTML](https://www.corelangs.com/html/introduction/doctype.html) sur la 1ère ligne de votre code HTML. Sinon, vous pourriez avoir des problèmes avec la hauteur des sections. Les exemples fournis utilisent HTML 5 doctype `<!DOCTYPE html>`.\n\nChaque section sera définie avec un élément contenant la classe `section`.\nLa section active par défaut sera la première section, qui sera considérée comme la page d'accueil.\n\nLes sections doivent être placées dans un emballage (`<div id=\"fullpage\">` dans ce cas). L'emballage ne peut pas être l'élément `body`.\n\n```html\n<div id=\"fullpage\">\n\t<div class=\"section\">Some section</div>\n\t<div class=\"section\">Some section</div>\n\t<div class=\"section\">Some section</div>\n\t<div class=\"section\">Some section</div>\n</div>\n```\n\nSi vous voulez définir un point de départ différent de la première section ou de la première diapositive d'une section, ajoutez simplement la classe `active` à la section et à la diapositive que vous voulez charger en premier.\n\n```html\n<div class=\"section active\">Some section</div>\n```\n\nAfin de créer un curseur paysage dans une section, chaque diapositive sera définie par défaut avec un élément contenant la classe `slide`:\n\n```html\n<div class=\"section\">\n\t<div class=\"slide\"> Slide 1 </div>\n\t<div class=\"slide\"> Slide 2 </div>\n\t<div class=\"slide\"> Slide 3 </div>\n\t<div class=\"slide\"> Slide 4 </div>\n</div>\n```\n\nVous pouvez voir un exemple entièrement fonctionnel de la structure HTML dans le [fichier `simple.html`](https://github.com/alvarotrigo/fullPage.js/blob/master/examples/simple.html).\n\n### Initialisation\n\n#### Initialisation avec Vanilla Javascript\nTout ce que vous avez à faire est d'appeler fullPage.js avant de fermer la balise `</body>`.\n\n```javascript\nnew fullpage('#fullpage', {\n\t//options here\n\tautoScrolling:true,\n\tscrollHorizontally: true\n});\n```\n\n#### Initialisation avec jQuery\nVous pouvez utiliser fullpage.js comme plugin jQuery si vous le souhaitez !\n\n```javascript\n$(document).ready(function() {\n\t$('#fullpage').fullpage({\n\t\t//options here\n\t\tautoScrolling:true,\n\t\tscrollHorizontally: true\n\t});\n\n\t// Example of how to use fullpage.js methods\n\t$.fn.fullpage.setAllowScrolling(false);\n});\n```\n\n#### Exemple de Vanille JS avec toutes les options\nUne initialisation plus complexe avec toutes les options définies pourrait ressembler à ceci :\n\n```javascript\n\nvar myFullpage = new fullpage('#fullpage', {\n\t// Navigation\n\tmenu: '#menu',\n\tlockAnchors: false,\n\tanchors:['firstPage', 'secondPage'],\n\tnavigation: false,\n\tnavigationPosition: 'right',\n\tnavigationTooltips: ['firstSlide', 'secondSlide'],\n\tshowActiveTooltip: false,\n\tslidesNavigation: false,\n\tslidesNavPosition: 'bottom',\n\n\t// Défilement\n\tcss3: true,\n\tscrollingSpeed: 700,\n\tautoScrolling: true,\n\tfitToSection: true,\n\tfitToSectionDelay: 600,\n\tscrollBar: false,\n\teasing: 'easeInOutCubic',\n\teasingcss3: 'ease',\n\tloopBottom: false,\n\tloopTop: false,\n\tloopHorizontal: true,\n\tcontinuousVertical: false,\n\tcontinuousHorizontal: false,\n\tscrollHorizontally: false,\n\tinterlockedSlides: false,\n\tdragAndMove: false,\n\toffsetSections: false,\n\tresetSliders: false,\n\tfadingEffect: false,\n\tnormalScrollElements: '#element1, .element2',\n\tscrollOverflow: true,\n\tscrollOverflowMacStyle: false,\n\tscrollOverflowReset: false,\n\ttouchSensitivity: 15,\n\tbigSectionsDestination: null,\n\tadjustOnNavChange: true,\n\n\t// Accessibilité\n\tkeyboardScrolling: true,\n\tanimateAnchor: true,\n\trecordHistory: true,\n\n\t// Design\n\tcontrolArrows: true,\n\tcontrolArrowsHTML: [\n\t\t'<div class=\"fp-arrow\"></div>', \n\t\t'<div class=\"fp-arrow\"></div>'\n\t],\n\tverticalCentered: true,\n\tsectionsColor : ['#ccc', '#fff'],\n\tpaddingTop: '3em',\n\tpaddingBottom: '10px',\n\tfixedElements: '#header, .footer',\n\tresponsiveWidth: 0,\n\tresponsiveHeight: 0,\n\tresponsiveSlides: false,\n\tcinematic: false,\n\tcinematicOptions: [Object],\n\teffects: false,\n\teffectsOptions: [Object],\n\tparallax: false,\n\tparallaxOptions: {type: 'reveal', percentage: 62, property: 'translate'},\n\tdropEffect: false,\n\tdropEffectOptions: { speed: 2300, color: '#F82F4D', zIndex: 9999},\n\twaterEffect: false,\n\twaterEffectOptions: { animateContent: true, animateOnMouseMove: true},\n\tcards: false,\n\tcardsOptions: {perspective: 100, fadeContent: true, fadeBackground: true},\n\n\t// Sélecteurs personnalisés\n\tsectionSelector: '.section',\n\tslideSelector: '.slide',\n\n\tlazyLoading: true,\n\tlazyLoadThreshold: 0,\n\tobserver: true,\n\tcredits: { enabled: true, label: 'Made with fullPage.js', position: 'right'},\n\n\t// Événements\n\tbeforeLeave: function(origin, destination, direction, trigger){},\n\tonLeave: function(origin, destination, direction, trigger){},\n\tafterLoad: function(origin, destination, direction, trigger){},\n\tafterRender: function(){},\n\tafterResize: function(width, height){},\n\tafterReBuild: function(){},\n\tafterResponsive: function(isResponsive){},\n\tafterSlideLoad: function(section, origin, destination, direction, trigger){},\n\tonSlideLeave: function(section, origin, destination, direction, trigger){},\n\tonScrollOverflow: function(section, slide, position, direction){}\n});\n```\n\n### Créer des liens vers des sections ou des diapositives\nSi vous utilisez fullPage.js avec des liens d'ancrage pour les sections (en utilisant l'option `anchors` ou l'attribut `data-anchor` dans chaque section), alors vous pourrez également utiliser des liens d'ancrage pour naviguer directement vers une certaine diapositive dans une section.\n\nCeci serait un exemple d'un lien avec un ancre : https://alvarotrigo.com/fullPage/#secondPage/2 (qui est l'URL que vous verrez une fois que vous accéderez à cette section/diapositive manuellement)\nRemarquez que la dernière partie de l'URL se termine par `#secondPage/2`.\n\nAvoir l'initialisation suivante :\n\n```javascript\nnew fullpage('#fullpage', {\n\tancres :['firstPage','secondPage','thirdPage']\n}) ;\n```\n\nL'ancre à la fin de l'URL `#secondPage/2` définit respectivement la section et la diapositive de destination. Dans l'URL précédente, la section de destination sera celle définie avec l'ancre `secondPage` et la diapositive sera la 2ème diapositive, car nous utilisons l'index `2` pour cela. (la première diapositive d'une section a l'index 0, car techniquement c'est une section).\n\nNous aurions pu utiliser une ancre personnalisée pour la diapositive au lieu de son index si nous avions utilisé l'attribut `data-anchor` sur le balisage HTML de cette façon :\n\n```html\n<div class=\"section\">\n\t<div class=\"slide\" data-anchor=\"slide1\"> Slide 1 </div> Slide 1\n\t<div class=\"slide\" data-anchor=\"slide2\"> Slide 2 </div>\n\t<div class=\"slide\" data-anchor=\"slide 3\"> slide 3 </div>\n\t<div class=\"slide\" data-anchor=\"slide4\"> Slide 4 </div>\n</div>\n```\nDans ce dernier cas, l'URL que nous utiliserions serait `#secondPage/slide3`, qui est l'équivalent de notre précédente `#secondPage/2`.\n\nNotez que les ancres de section peuvent aussi être définies de la même manière, en utilisant l'attribut `data-anchor`, si aucun tableau `anchors` n'est fourni.\n\n**Attention!**, les balises `data-anchor` ne peuvent pas avoir la même valeur que n'importe quel élément ID sur le site (ou élément NAME pour IE).\n\n### Créer des sections plus petites ou plus grandes\n[Démo](https://codepen.io/alvarotrigo/pen/BKjRYm) fullPage.js fournit un moyen de supprimer la restriction de hauteur complète de ses sections et diapositives. Il est possible de créer des sections dont la hauteur est plus petite ou plus grande que la fenêtre. C'est idéal pour les pieds de page.\nIl est important de réaliser qu'il n'est pas logique d'avoir toutes vos sections utilisant cette fonctionnalité. S'il y a plus d'une section dans le chargement initial du site, fullPage.js ne défilera pas du tout pour voir la section suivante comme elle sera déjà dans la fenêtre.\n\nPour créer des sections plus petites, utilisez simplement la classe `fp-auto-height` dans la section que vous voulez appliquer. Il prendra alors la hauteur définie par le contenu de votre section/diapositive.\n\n\n\n```html\n<div class=\"section\">Vue d'ensemble </div>\n<div class=\"section fp-auto-height\">Auto height</div>\n```\n\n##### Sections de hauteur automatique réactives\nUne hauteur automatique réactive peut être appliquée en utilisant la classe `fp-auto-haut-responsive`. De cette façon, les sections seront en plein écran jusqu'à ce que le mode réactif soit activé. Ensuite, ils prendront la taille requise par leur contenu, qui peut être plus grand ou plus petit que la fenêtre d'affichage.\n\n#### Classes d'états ajoutées par fullpage.js\nFullpage.js ajoute plusieurs classes dans différents éléments pour garder une trace de l'état du site :\n\n- `active` est ajouté la section visible actuelle et la diapositive.\n- `active` est ajouté à l'élément de menu courant (si vous utilisez l'option \"menu\").\n- `fp-loaded` est ajouté à l’élément section ou slide qui déclenche le chargement différé du contenu multimédia.\n- Une classe de la forme `fp-viewing-SECTION-SLIDE` est ajoutée à l'élément `body` du site. (ex :[`fp-viewing-secondPage-0`](https://alvarotrigo.com/fullPage/#secondPage))) Les parties ` SECTION ` et ` SLIDE ` seront les ancres (ou index si aucune ancre n'est fournie) de la section et de la glissière courante.\n- `fp-responsive` est ajouté à l'élément `body` lorsque l'entrée en mode réactif\n- `fp-enabled ` est ajouté à l'élément `html` lorsque fullpage.js est activé. (et enlevés lorsqu'ils sont détruits).\n- `fp-destroyed` est ajouté au conteneur fullpage.js lorsque fullPage.js est détruit.\n\n#### Lazy Loading\n[Demo](https://codepen.io/alvarotrigo/pen/eNLBXo) fullPage.js fournit un moyen de charger paresseusement des images, des vidéos et des éléments audio pour qu'ils ne ralentissent pas le chargement de votre site ou le transfert de données inutilement gaspillé.\nSi vous utilisez un chargement paresseux, tous ces éléments ne seront chargés qu'en entrant dans la fenêtre d'affichage.\nPour activer le lazy loading, il vous suffit de changer votre attribut `src` en `data-src` comme indiqué ci-dessous :\n\n```html\n<img data-src=\"image.png\">\n<vidéo>\n\t<source data-src=\"video.webm\" type=\"video/webm\" />\n\t<source data-src=\"video.mp4\" type=\"video/mp4\" />\n</vidéo>\n ```\n\nSi vous utilisez déjà une autre solution de chargement paresseux qui utilise également `data-src`, vous pouvez désactiver le chargement paresseux de fullPage.js en définissant l'option `lazyLoading : false`.\n\n### Lecture automatique/pause automatique des médias intégrés\n\n[Demo](https://codepen.io/alvarotrigo/pen/pXEaaK) **Note** : la fonction de lecture automatique peut ne pas fonctionner sur certains appareils mobiles selon le système d'exploitation et le navigateur (i.e. [Safari on iOS](https://webkit.org/blog/6784/new-video-policies-for-ios/) version < 10.0).\n\n##### Jouer sur la section/charge de diapositives :\nL'utilisation de l'attribut `autoplay` pour les vidéos ou l'audio, ou du paramètre `autoplay=1` pour les iframes youtube entraînera la lecture de l'élément média au chargement de la page.\nPour le lire sur le chargement de sections/diapositives, utilisez à la place l'attribut `data-autoplay`. Par exemple :\n\n```html\n<audio data-autoplay>\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\n</audio>\n```\n\n##### Pause en congé\nLes iframes HTML5 `<video>` / `<audio>` et Youtube sont automatiquement mis en pause lorsque vous vous éloignez d'une section ou d'une diapositive. Ceci peut être désactivé en utilisant l'attribut `data-autoplay`. Par exemple :\n\n```html\n<audio data-autoplay>\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\n</audio>\n```\n\n#### Utiliser des extensions\nfullpage.js [fournit un ensemble d'extensions](https://alvarotrigo.com/fullPage/extensions/) que vous pouvez utiliser pour améliorer ses fonctionnalités par défaut. Toutes ces options sont listées comme [options fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/dev/lang/french/#options).\n\nExtensions nécessite que vous utilisiez le fichier minifié [`fullpage.extensions.min.js`](https://github.com/alvarotrigo/fullPage.js/blob/master/dist/fullpage.extensions.min.js) qui se trouve dans le dossier [`dist`](https://github.com/alvarotrigo/fullPage.js/tree/master/dist) au lieu du fichier fullPage.js habituel (`fullpage.js` ou `fullpage.min.js`).\n\nUne fois le fichier d'extension acquis, vous devrez l'ajouter avant fullPage. Par exemple, si je veux utiliser l'extension Continuous Horizontal, j'aurais inclus le fichier d'extension puis la version des extensions du fichier fullPage.\n\n```html\n<script type=\"text/javascript\" src=\"fullpage.continuousHorizontal.min.js\"></script>\n<script type=\"text/javascript\" src=\"fullpage/fullpage.extensions.min.js\"></script>\n```\n\nUne clé d'activation et une clé de licence seront requises pour chaque extension. [Voir plus de détails à ce sujet ici](https://github.com/alvarotrigo/fullPage.js/wiki/How-to-activate-a-fullPage.js-extension).\n\nVous pourrez ensuite les utiliser et les configurer comme expliqué dans [options](https://github.com/alvarotrigo/fullPage.js/tree/dev/lang/french#options).\n\n## Options\n\n### licenseKey\n(défaut `null`).**Cette option est facultltative.** Si vous utilisez fullPage dans un projet non open source, vous devez utiliser la clé de licence fournie lors de l'achat de la Licence Commerciale fullPage. Si votre projet est open source, [contactez-moi](https://alvarotrigo.com/#contact) avec un lien vers son répertoire et je vous fournirai une clé de licence. Pour en savoir plus sur les licences [ici](https://github.com/alvarotrigo/fullPage.js#license) et [sur le site Web](https://alvarotrigo.com/fullPage/pricing/). Par exemple :\n\n```javascript\nnew fullpage('#fullpage', {\n\tlicenceKey:'VOTRE_CLÉ_ICI'.\n});\n```\n\n### controlArrows\n(défaut `true`) Détermine s'il faut utiliser les flèches de contrôle pour que les diapositives se déplacent vers la droite ou vers la gauche.\n\n### controlArrowsHTML\n(default `['<div class=\"fp-arrow\"></div>', '<div class=\"fp-arrow\"></div>'],`). Provides a way to define the HTML structure and the classes that you want to apply to the control arrows for sections with horizontal slides. The array contains the structure for both arrows. The first item is the left arrow and the second, the right one. (translation needed)\n\n### verticalCentered\n(défaut `true`) Centrer verticalement le contenu à l'intérieur des sections. (Uses flexbox) You might want to wrap your content in a `div` to avoid potential issues. (Uses `flex-direction: column; display: flex; justify-content: center;`)\n\n### scrollingSpeed\n(défaut `700`) Vitesse en millisecondes pour les transitions de défilement.\n\n### sectionsColor\n(default `none`) Définissez la propriété CSS `background-color` pour chaque section.\nExemple :\n\n```Javascript\nnew fullpage('#fullpage', {\n\tsectionsCouleur : ['#f2f2f2f2','#4BBFC3','#7BAABE','whitesmoke','#000'],\n}) ;\n```\n\n### anchors\n(default `[]`) Définit les liens d'ancrage (#exemple) à afficher sur l'URL de chaque section. La valeur des ancres doit être unique. La position des ancres dans le tableau définira à quelles sections l'ancre est appliquée. (deuxième position pour la deuxième section et ainsi de suite). L'utilisation des ancres permet également de naviguer vers l'avant et vers l'arrière par le biais du navigateur. Cette option permet également aux utilisateurs de mettre en signet une section ou une diapositive spécifique. **Attention**, les ancres ne peuvent pas avoir la même valeur que n'importe quel élément ID sur le site (ou élément NOM pour IE). Maintenant les ancres peuvent être définies directement dans la structure HTML en utilisant l'attribut `data-anchor` comme expliqué ici.\n\n### lockAnchors\n(default `false`) Détermine si les ancres dans l'URL auront un effet dans la bibliothèque. Vous pouvez toujours utiliser les ancres en interne pour vos propres fonctions et rappels, mais elles n'auront aucun effet sur le défilement du site. Utile si vous voulez combiner fullPage.js avec d'autres plugins en utilisant l'ancre dans l'URL.\n\n### easing\n(default `easeInOutCubic`) Définit l'effet de transition à utiliser pour le défilement vertical et horizontal. Il nécessite le fichier `vendors/easings.min.js` ou [jQuery UI](https://jqueryui.com/) pour utiliser certaines de[ses transitions](https://api.jqueryui.com/easings/). D'autres bibliothèques pourraient être utilisées à la place.\n\n### easingcss3\n(default `ease`) Définit l'effet de transition à utiliser en cas d'utilisation de `css3:true`. Vous pouvez utiliser les [prédéfinis](https://www.w3schools.com/cssref/css3_pr_transition-timing-function.asp) (tels que `linear`, `ease-out`...) ou créer vos propres en utilisant la fonction `cubic-bezier`. Vous pouvez utiliser [Matthew Lein CSS Easing Animation Tool](https://matthewlein.com/ceaser/) pour cela.\n\n### loopTop\n(défaut `false`) Définit si le défilement vers le haut dans la première section doit défiler jusqu'à la dernière section ou non.\n\n###  loopBottom\n(défaut `false`) Définit si le défilement vers le bas dans la dernière section doit défiler vers la première ou non.\n\n### loopHorizontal\n(défaut `true`) Définit si les curseurs horizontaux boucleront après avoir atteint la dernière diapositive ou la précédente ou non.\n\n### css3\n(défaut `true`). Définit s'il faut utiliser des transformations JavaScript ou CSS3 pour faire défiler les sections et les diapositives. Utile pour accélérer le mouvement dans les tablettes et les appareils mobiles avec les navigateurs supportant CSS3. Si cette option est définie sur `true` et que le navigateur ne supporte pas CSS3, un repli sera utilisé à la place.\n\n### autoScrolling\n(défaut `true`) Définit s'il faut utiliser le défilement \"automatique\" ou \"normal\". Cela a également une incidence sur la façon dont les sections s'intègrent dans la fenêtre du navigateur/de l'appareil dans les tablettes et les téléphones mobiles.\n\n### fitToSection\n(défaut `true`) Détermine si des sections doivent ou non être ajustées à la fenêtre d'affichage. Lorsqu'elle est réglée sur `true`, la section active courante remplira toujours toute la fenêtre d'affichage. Sinon, l'utilisateur sera libre de s'arrêter au milieu d'une section.\n\n### fitToSectionDelay\n(défaut 1000). Si `fitToSection` est mis à true, cela retarde l'adaptation par millisecondes configurées.\n\n### scrollBar\n(défaut `false`) Détermine s'il faut utiliser la barre de défilement pour le site ou non. En cas d'utilisation de la barre de défilement, la fonctionnalité `autoScrolling` fonctionnera toujours comme prévu. L'utilisateur sera également libre de faire défiler le site avec la barre de défilement et fullPage.js s'adaptera à la section à l'écran lorsque le défilement sera terminé.\n\n### paddingTop\n(défaut `0`) Définit le remplissage supérieur de chaque section avec une valeur numérique et sa mesure (paddingTop:'10px', paddingTop:'10em'...) Utile en cas d'utilisation d'un en-tête fixe.\n\n### paddingBottom\n(défaut `0`) Définit le rembourrage inférieur de chaque section avec une valeur numérique et sa mesure (rembourrageBottom:'10px', rembourrageBottom:'10em'...). Utile en cas d'utilisation d'un pied de page fixe.\n\n### fixedElements\n(default `null`) Définit les éléments qui seront retirés de la structure déroulante du plugin, ce qui est nécessaire lorsque l'option `css3` est utilisée pour les garder fixes. Il faut une chaîne de caractères avec les sélecteurs Javascript pour ces éléments. (Par exemple : `fixedElements:'#element1, .element2'`)\n\n### normalScrollElements\n(défaut `null`) [Demo](https://codepen.io/alvarotrigo/pen/RmVazM) Si vous voulez éviter le défilement automatique lorsque vous faites défiler certains éléments, c'est l'option que vous devez utiliser. (utile pour les cartes, les scrolling divs, etc.) Il faut une chaîne de caractères avec les sélecteurs Javascript pour ces éléments. (Par exemple : `normalScrollElements:'#element1, .element2'`). Cette option ne doit pas être appliquée à une section ou à un élément de diapositive en soi.\n\n### bigSectionsDestination\n(défaut `null`) Définit comment faire défiler jusqu'à une section dont la taille est supérieure à celle de la fenêtre. Par défaut, fullPage.js fait défiler vers le haut si vous venez d'une section située au-dessus de celle de destination et vers le bas si vous venez d'une section située au-dessous de celle de destination. Les valeurs possibles sont `haut`,`bas` et `null`. \n\n### adjustOnNavChange\n(défaut `true`)\nDéfinit si fullPage.js ajuste la hauteur des sections lorsque la barre de navigation ou la barre d'adresse mobile change de taille ou alterne sa visibilité. Si défini sur `false`, les sections n’apparaîtront pas en pleine hauteur lorsque la barre de navigation se réduit ou disparaît.\n\n### KeyboardScrolling\n(défaut `true`) Définit si le contenu peut être navigué à l'aide du clavier.\n\n### touchSensitivity\n(défaut `5`) Définit un pourcentage de la largeur/hauteur de la fenêtre du navigateur, et la distance que doit mesurer un glissement pour naviguer vers la section / diapositive suivante\n\n### skipIntermediateItems\n(valeur par défaut `false`). Détermine s'il faut ignorer l'animation de défilement lors de la navigation entre des sections verticales ou des diapositives horizontales non consécutives. Les valeurs possibles sont `true`, `false`, `sections` et `slides`, permettant d'appliquer ce comportement verticalement, horizontalement ou dans les deux directions.\n\n### continuousVertical\n(défaut `false`) Définit si le défilement vers le bas dans la dernière section ou doit descendre jusqu'à la première et si le défilement vers le haut dans la première section doit monter jusqu'à la dernière. Non compatible avec `loopTop`, `loopBottom` ou toute barre de défilement présente dans le site (`scrollBar:true` ou `autoScrolling:false`).\n\n### continuousHorizontal\n(défaut `false`) [Extension de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Définit si le défilement à droite dans la dernière diapositive doit glisser à droite vers la première ou non, et si le défilement à gauche dans la première diapositive doit glisser à gauche vers la dernière ou non. Non compatible avec `loopHorizontal`. Nécessite fullpage.js >= 3.0.1.\n\n### scrollHorizontally\n(défaut `false`) [Extension de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Définit si l'on doit glisser horizontalement dans les curseurs en utilisant la molette de la souris ou le pavé tactile. Il ne peut être utilisé que lors de l'utilisation : `autoScrolling:true`. Idéal pour raconter une histoire. Nécessite fullpage.js >= 3.0.1.\n\n### interlockedSlides\n(défaut `false`) [Extension de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Détermine si le déplacement d'un curseur horizontal va forcer le glissement des curseurs de l'autre section dans la même direction. Les valeurs possibles sont `true`, `false` ou un tableau avec les sections imbriquées. Par exemple, `[1,3,5]` commençant par 1. Nécessite fullpage.js >= 3.0.1.\n\n### dragAndMove\n(défaut `false`) [Extension de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Active ou désactive le glisser-déposer de sections et de diapositives en utilisant la souris ou les doigts. Nécessite fullpage.js >= 3.0.1. Les valeurs possibles sont :\n  - `true` : active la fonction.\n  - `false` : désactive la fonctionnalité.\n  - `vertical` : active la fonctionnalité uniquement verticalement.\n  - `horizontal` : active la fonctionnalité seulement horizontalement.\n  - `fingersonly` : active la fonction pour les périphériques tactiles seulement.\n  - `mouseonly` : active la fonctionnalité pour les périphériques de bureau uniquement (souris et trackpad).\n\n### offsetSections\n(défaut `false`) [Extension de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Fournit un moyen d'utiliser des sections non plein écran basées sur le pourcentage. Idéal pour montrer aux visiteurs qu'il y a plus de contenu dans le site en affichant une partie de la section suivante ou précédente. Nécessite fullPage.js >= 3.0.1.\nPour définir le pourcentage de chaque section, l'attribut `data-percentage` doit être utilisé. Le centrage de la section dans le viewport peut être déterminé en utilisant une valeur booléenne dans l'attribut `data-centered` (défaut à `true` si non spécifié). Par exemple :\n\n``` html\n<div class=\"section\" data-percentage=\"80\" data-centered=\"true\">\n```\n\n### resetSliders\n(défaut `false`). Extension de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Définit s'il faut ou non réinitialiser chaque curseur après avoir quitté sa section. Nécessite fullpage.js >= 3.0.1.\n\n### fadingEffect\n(défaut `false`). [Extension de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Définit si un effet de fondu enchaîné doit être utilisé ou non à la place de l'effet de défilement par défaut. Les valeurs possibles sont `true`, `false`, `sections`, `slides`. Il peut donc être appliqué juste verticalement ou horizontalement, ou aux deux à la fois. Il ne peut être utilisé que lors de l'utilisation : `autoScrolling:true`. Nécessite fullpage.js >= 3.0.1.\n\n### animateAnchor\n(défaut `true`) Définit si le chargement du site quand on lui donne une ancre (#) va défiler avec l'animation jusqu'à sa destination ou va se charger directement sur la section donnée.\n\n### recordHistory\n(défaut `true`) Définit si l'état du site doit être poussé dans l'historique du navigateur. Quand il est défini à `true`, chaque section/glissière du site agira comme une nouvelle page et les boutons avant et arrière du navigateur feront défiler les sections/glissières pour atteindre l'état précédent ou suivant du site. Quand il est réglé sur `false`, l'URL continuera à changer mais n'aura aucun effet sur l'historique du navigateur. Cette option est automatiquement désactivée lors de l'utilisation de `autoScrolling:false`.\n\n### menu\n(défaut `false`) Un sélecteur peut être utilisé pour spécifier le menu à lier avec les sections. De cette façon, le défilement des sections activera l'élément correspondant dans le menu en utilisant la classe `active`.\nCela ne générera pas de menu mais ajoutera simplement la classe `active` à l'élément du menu donné avec les liens d'ancrage correspondants.\nAfin de lier les éléments du menu avec les sections, un data-tag HTML 5 (`data-menuanchor`) sera nécessaire à utiliser avec les mêmes liens d'ancrage que ceux utilisés dans les sections. Exemple :\n\n```html\n<ul id=\"myMenu\">\n\t<li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">Première section</a></li>\n\t<li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Seconde section</a></li>\n<li data-menuanchor=\"thirdPage\"><a href=\"#thirdPage\">Troisième section</a></li>\n<li data-menuanchor=\"fourthPage\"><a href=\"#fourthPage\">Quatrième section</a></li>\n</ul>\n```\n```javascript\nnew fullpage('#fullpage', {\nanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\nmenu : #myMenu\n}) ;\n```\n\n**Note:** l'élément de menu doit être placé en dehors du wrapper de la page entière afin d'éviter tout problème lors de l'utilisation de `css3:true`. Sinon, il sera ajouté au `body` par le plugin lui-même.\n\n### navigation\n(défaut `false`) Si elle est définie à `true`, elle affichera une barre de navigation composée de petits cercles.\n\n### navigationPosition\n(défaut `none`) Il peut être mis à `left` ou `right` et définit quelle position la barre de navigation sera affichée (si vous en utilisez une).\n\n### navigationTooltips\n(défaut []) Définit les info-bulles à afficher pour les cercles de navigation au cas où ils seraient utilisés. Exemple : `navigationTooltips` : 'premierSlide', 'secondSlide']`. Vous pouvez aussi les définir en utilisant l'attribut `data-tooltip` dans chaque section si vous préférez.\n\n- Voir aussi l'attribut `showActiveTooltip` : (défaut `false`) Affiche une info-bulle persistante pour la section visualisée activement dans la navigation verticale.\n\n### slidesNavigation\n(défaut `false`) Si défini à `true`, il affichera une barre de navigation composée de petits cercles pour chaque curseur de paysage sur le site.\n\n### slidesNavPosition\n(défaut `bottom`) Définit la position de la barre de navigation en mode paysage pour les curseurs. Admet les valeurs `top` et `bottom`. Vous pouvez modifier les styles CSS pour déterminer la distance du haut ou du bas ainsi que tout autre style tel que la couleur.\n\n### scrollOverflow\n(défaut `true`) définit si oui ou non il faut créer un défilement pour la section/glissière dans le cas où son contenu est plus grand que la hauteur de celle-ci. It requires the default value `scrollBar: false`. Afin d'éviter que fullpage.js ne crée la barre de défilement dans certaines sections ou diapositives, utilisez la classe `fp-noscroll`. Par exemple : `<div class=\"section fp-noscroll\">`\n\nVous pouvez aussi empêcher le scrolloverflow d'être appliqué en mode réactif lorsque vous utilisez `fp-auto-height-responsive` dans l'élément section.\n\n### scrollOverflowMacStyle\n(default `false`). When active, this option will use a \"mac style\" for the scrollbar instead of the default one, which will look quite different in Windows computers. (translation needed)\n\n### scrollOverflowReset\n(défaut `false`) [Extension de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Quand il est défini à `true`, il fait défiler le contenu de la section/glissière avec la barre de défilement en partant vers une autre section verticale. De cette façon, la section/glissière affichera toujours le début de son contenu, même si elle défile à partir d'une section située en dessous. Possible values are `true`, `false`, `sections`, `slides`.Adding the class `fp-no-scrollOverflowReset` on the section or slide will disable this feature for that specific panel.\n\n### sectionSelector\n(défaut `.section`) Définit le sélecteur Javascript utilisé pour les sections du plugin. Il peut avoir besoin d'être changé parfois pour éviter des problèmes avec d'autres plugins utilisant les mêmes sélecteurs que fullpage.js.\n\n### slideSelector\n(défaut `.slide`) Définit le sélecteur Javascript utilisé pour les diapositives du plugin.  Il peut avoir besoin d'être changé parfois pour éviter des problèmes avec d'autres plugins utilisant les mêmes sélecteurs que fullpage.js.\n\n### responsiveWidth\n(défaut `0`) Un défilement normal (`autoScrolling:false`) sera utilisé sous la largeur définie en pixels. Une classe `fp-responsive` est ajoutée à la balise body au cas où l'utilisateur voudrait l'utiliser pour son propre CSS réactif. Par exemple, si elle est définie à 900, chaque fois que la largeur du navigateur est inférieure à 900, le plugin défile comme un site normal.\n\n### responsiveHeight\n(défaut `0`) Un défilement normal (`autoScrolling:false`) sera utilisé sous la hauteur définie en pixels. Une classe `fp-responsive` est ajoutée à la balise body au cas où l'utilisateur voudrait l'utiliser pour son propre CSS réactif. Par exemple, si elle est définie à 900, chaque fois que la hauteur du navigateur est inférieure à 900, le plugin défile comme un site normal.\n\n### responsiveSlides\n(défaut `false`) [Extension de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Quand il est réglé sur `true`, les diapositives seront transformées en sections verticales quand le mode réactif est activé. (en utilisant les options `responsiveWidth` ou `responsiveHeight` détaillées ci-dessus). Nécessite fullpage.js >= 3.0.1.\n\n### cinematic\n\n(valeur par défaut `false`) [Extension de fullpage.js](https://alvarotrigo.com/fullPage/extensions/cinematic.html). Active ou désactive les effets de slider sur les sections. Nécessite fullpage.js >= 4.0.41.\n\n### cinematicOptions\n\n(valeur par défaut : `{Object}`) Permet de configurer les paramètres d’animation du contenu lors de l’utilisation de l’option `cinematic:true`. [En savoir plus](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cinematic-Effects#cinematicoptions).\n\n### effects\n(par défaut : `false`) [Extension de fullpage.js](https://alvarotrigo.com/fullPage/extensions/slider-effects.html). Active ou désactive les effets de transition sur les sections. Nécessite fullpage.js >= 4.0.35\n\n### effectsOptions\n(par défaut : `{Object}`, configuration pour le preset [\"focus\"](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#20-available-presetss)).  \nPermet de configurer les paramètres des effets lorsque l’option `effects:true` est utilisée. [En savoir plus sur l’utilisation de l’option effects](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#effects-options-documentation)\n\n### parallax:true\n[En savoir plus sur la façon d'appliquer l'option parallax](https://github.com/alvarotrigo/fullPage.js/blob/master/lang/french/parallax-extension.md).\n\n### parallaxOptions\n(default: `{ type: 'reveal', percentage: 62, property: 'translate'}`). \nAllows to configure the parameters for the parallax backgrounds effect when using the option `parallax:true`. [Read more about how to apply the parallax option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax).\n\n### dropEffect\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Defines whether or not to use the drop effect on sections / slides. [Read more about how to apply the the drop effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect).\n\n### dropEffectOptions\n(default: `{ speed: 2300, color: '#F82F4D', zIndex: 9999}`). \nAllows to configure the parameters for the drop effect when using the option `dropEffect:true`.[Read more about how to apply the the drop effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect).\n\n### waterEffect\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Defines whether or not to use the water effect on sections / slides. [Read more about how to apply the the water effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect).\n\n### waterEffectOptions\n(default: `{ animateContent: true, animateOnMouseMove: true}`). \nAllows to configure the parameters for the water effect when using the option `waterEffect:true`.[Read more about how to apply the the water effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect).\n\n### cards\n(défaut `false`) [Extension de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Définit s'il faut ou non utiliser l'effet des cartes sur les sections/glissières. [Lire plus sur comment appliquer l'option cartes](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards).\n\n### cardsOptions\n(défaut : `{ perspective : 100, fadeContent : true, fadeBackground : true}`).\nVous permet de configurer les paramètres pour l'effet des cartes quand vous utilisez l'option `cards:true`. [Lire plus sur comment appliquer l'option cartes](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards).\n\n### lazyLoading\n(défaut `true`) Le chargement paresseux est actif par défaut ce qui signifie qu'il chargera paresseusement tout élément média contenant l'attribut `data-src` comme détaillé dans la [Lazy Loading docs](https://github.com/alvarotrigo/fullPage.js/tree/dev/lang/french/#lazy-loading) . Si vous voulez utiliser une autre bibliothèque de chargement paresseux, vous pouvez désactiver cette fonctionnalité de fullpage.js.\n\n### lazyLoadThreshold\n(par défaut `0`) Spécifie le nombre de sections verticales adjacentes et de diapositives horizontales dont les éléments multimédias doivent être chargés de manière différée par rapport à la section actuelle. Utilisez un nombre pour spécifier combien de sections ou diapositives précédentes et suivantes doivent être préchargées.\n\n### observer\n(default `true`) Defines whether or not to observe changes in the HTML structure of the page. When enabled, fullPage.js will automatically react to those changes and update itself accordingly. Ideal when adding, removing or hidding sections or slides. (translation needed)\n\n### credits\n(default `{enabled: true, label: 'Made with fullpage.js', position: 'right'}`).\nDefines whether to use fullPage.js credits. As per clause 0, 4, 5 and 7 of the GPLv3 licecense, those using fullPage.js under the GPLv3 are required to give prominent notice that fullPage.js is in use. We recommend including attribution by keeping this option enabled. (translation needed). **Remarque:**Cette option nécessite une valeur valide pour licenseKey.\n\n## Méthodes\nVous pouvez les voir en action [ici](https://alvarotrigo.com/fullPage/examples/methods.html)\n\n### getActiveSection()\n[Demo](https://codepen.io/alvarotrigo/pen/VdpzRN/) Obtient un objet (type [Section](https://github.com/alvarotrigo/fullPage.js/tree/dev/lang/french/#callbacks)) contenant la section active et ses propriétés.\n\n```javascript\nfullpage_api.getActiveSection() ;\n```\n\n### getActiveSlide()\n[Demo](https://codepen.io/alvarotrigo/pen/VdpzRN/) Obtient un objet (type [Diapositive](https://github.com/alvarotrigo/fullPage.js/tree/dev/lang/french/#callbacks)) contenant la diapositive active et ses propriétés.\n\n```javascript\nfullpage_api.getActiveSlide() ;\n```\n\n### getScrollY() & getScrollX\n[Demo](https://codepen.io/alvarotrigo/pen/GRyGqro) `getScrollY` Gets the Y position of the fullPage wrapper. `getScrollX` gets the X position of the active horizontal slide.\n\n```javascript\nfullpage_api.getScrollY();\nfullpage_api.getScrollX();\n```\n\n### moveSectionUp()\n[Demo](https://codepen.io/alvarotrigo/pen/GJXNMN) Fait défiler une section vers le haut :\n```javascript\nfullpage_api.moveSectionUp() ;\n```\n---\n### moveSectionDown()\n[Demo](https://codepen.io/alvarotrigo/pen/jPvVZx) Fait défiler une section vers le bas :\n```javascript\nfullpage_api.moveSectionDown() ;\n```\n---\n### moveTo(section, slide)\n[Demo](https://codepen.io/alvarotrigo/pen/doqOmY) Fait défiler la page jusqu'à la section donnée et fait glisser. La première section aura l'index 1 tandis que la première diapositive, celle qui est visible par défaut, aura l'index 0.\n```javascript\n/*Défilement vers la section avec le lien d'ancrage `firstSlide` et vers le 2nd Slide */\nfullpage_api.moveTo('firstSlide', 2) ;\n\n```\n\n```javascript\n//Se rendre à la 3ème section (avec l'index 3) du site\nfullpage_api.moveTo(3, 0) ;\n\n//Qui est identique à\nfullpage_api.moveTo(3) ;\n```\n---\n### silentMoveTo(section, slide)\n[Démo](https://codepen.io/alvarotrigo/pen/doqOeY)\nExactement la même chose que [`moveTo`](https://github.com/alvarotrigo/fullPage.js/tree/dev/lang/french/#movetosection-slide) mais dans ce cas il effectue le défilement sans animation. Un saut direct vers la destination.\n```javascript\n/*Défilement vers la section avec le lien d'ancrage `firstSlide` et vers le 2nd Slide */\nfullpage_api.silentMoveTo('firstSlide', 2) ;\n```\n---\n### moveSlideRight()\n[Démo](https://codepen.io/alvarotrigo/pen/Wvgoyz)\nFait défiler le curseur horizontal de la section en cours jusqu'à la diapositive suivante :\n```javascript\nfullpage_api.moveSlideRight() ;\n```\n---\n### moveSlideLeft()\n[Démo](https://codepen.io/alvarotrigo/pen/gpdLjW)\nFait défiler le curseur horizontal de la section en cours jusqu'à la diapositive précédente :\n```javascript\nfullpage_api.moveSlideLeft() ;\n```\n---\n### setAutoScrolling(booléen)\n[Demo](https://codepen.io/alvarotrigo/pen/rVZWrR) Définit la configuration de défilement en temps réel.\nDéfinit le comportement du défilement de la page. S'il est réglé sur `true`, il utilisera le défilement `automatique`, sinon, il utilisera le défilement `manuel` ou `normal` du site.\n\n```javascript\nfullpage_api.setAutoScrolling(false) ;\n```\n---\n### setFitToSection(booléen)\n[Démo](https://codepen.io/alvarotrigo/pen/GJXNYm)\nDéfinit la valeur de l'option `fitToSection` déterminant si la section doit être affichée à l'écran ou non.\n\n```javascript\nfullpage_api.setFitToSection(false) ;\n```\n---\n### fitToSection()\n[Démo](https://codepen.io/alvarotrigo/pen/JWWagj)\nFait défiler jusqu'à la section active la plus proche qui s'adapte dans la fenêtre de visualisation.\n\n```javascript\nfullpage_api.fitToSection() ;\n```\n---\n### setLockAnchors(booléen)\n[Démo](https://codepen.io/alvarotrigo/pen/yNxVRQ)\nDéfinit la valeur de l'option `lockAnchors` déterminant si les ancres auront un effet dans l'URL ou non.\n\n```javascript\nfullpage_api.setLockAnchors(false) ;\n```\n---\n### setKeyboardScrolling(boolean, [directions])\n[Demo](https://codepen.io/alvarotrigo/pen/EjeNdq) Ajoute ou supprime la possibilité de faire défiler les sections/glissières en utilisant la roulette de la souris/le trackpad ou les gestes du toucher (qui est actif par défaut). Notez que cela ne désactivera pas le défilement du clavier. Vous\naurait besoin d'utiliser `setKeyboardScrolling` pour cela.\n\n- `directions` : (paramètre optionnel) Valeurs admises : `all`, `up`, `down`, `left`, `right` ou une combinaison de ces valeurs séparées par des virgules comme `down, right`. Il définit la direction pour laquelle le défilement sera activé ou désactivé.\n\n```javascript\n//désactivation de tout le défilement du clavier\nfullpage_api.setKeyboardScrolling(false) ;\n\n//désactivation du défilement du clavier\nfullpage_api.setKeyboardScrolling(false, 'down') ;\n\n//désactivation du défilement du clavier vers le bas et vers la droite\nfullpage_api.setKeyboardScrolling(false, 'down, right') ;\n```\n---\n### setRecordHistory(booléen)\n[Demo](https://codepen.io/alvarotrigo/pen/rVZWQb) Définit s'il faut enregistrer l'historique pour chaque changement de hachage dans l'URL.\n\n```javascript\nfullpage_api.setRecordHistory(false) ;\n```\n---\n### setScrollingSpeed(millisecondes)\n[Démo](https://codepen.io/alvarotrigo/pen/NqLbeY) Définit la vitesse de défilement en millisecondes.\n\n```javascript\nfullpage_api.setScrollingSpeed(700) ;\n```\n---\n### destroy(type)\n[Demo](https://codepen.io/alvarotrigo/pen/bdxBzv) Détruit les événements du plugin et éventuellement son balisage HTML et ses styles.\nIdéal à utiliser lorsque vous utilisez AJAX pour charger du contenu.\n\n- `type` : (paramètre optionnel) peut être vide ou `all`. Si `all` est passé, le balisage HTML et les styles utilisés par fullpage.js seront supprimés. De cette façon, le balisage HTML original, celui utilisé avant toute modification du plugin, sera maintenu.\n\n```javascript\n//destruction de tous les événements Javascript créés par fullPage.js (défilement, hashchange dans l'URL...)\nfullpage_api.destroy() ;\n\n//déstruction de tous les événements Javascript et de toute modification faite par fullPage.js par rapport à votre balisage HTML d'origine.\nfullpage_api.destroy('all') ;\n```\n---\n### reBuild()\nMet à jour la structure du DOM pour l'adapter à la nouvelle taille de la fenêtre ou à son contenu.\n Idéal à utiliser en combinaison avec des appels AJAX ou des changements externes dans la structure DOM du site, spécialement quand on utilise `scrollOverflow:true`.\n\n```javascript\nfullpage_api.reBuild() ;\n```\n---\n### setResponsive(booléen)\n[Demo](https://codepen.io/alvarotrigo/pen/WxOyLA) Définit le mode de réponse de la page. Quand il est réglé sur `true`, le défilement automatique sera désactivé et le résultat sera exactement le même que lorsque les options `responsiveWidth` ou `responsiveHeight` sont activées.\n```javascript\nfullpage_api.setResponsive(true) ;\n```\n---\n### responsiveSlides.toSections()\n[Extension de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Nécessite fullpage.js >= 3.0.1.\nTransforme les diapositives horizontales en sections verticales.\n\n```javascript\nfullpage_api.responsiveSlides.toSections() ;\n```\n---\n### responsiveSlides.toSlides()\n[Extension de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Nécessite fullpage.js >= 3.0.1.\nRetourne les diapositives originales (maintenant converties en sections verticales) en diapositives horizontales à nouveau.\n\n```javascript\nfullpage_api.responsiveSlides.toSlides() ;\n```\n\n## Callbacks\n[Démo](https://codepen.io/alvarotrigo/pen/XbPNQv) Vous pouvez les voir en action [ici](https://alvarotrigo.com/fullPage/examples/callbacks.html).\n\nCertains callbacks, tels que `onLeave` contiendront des paramètres de type Object contenant les propriétés suivantes :\n\n- `anchor` : *(String)* l'ancre de l'objet.\n- Index : *( Number)* index de l'objet.\n- `item` : *(élément DOM)* élément de l'article.\n- `isFirst` : *( Boolean )* détermine si l'item est le premier enfant.\n- `isLast` : *( Boolean)* détermine si l'item est le dernier enfant.\n\n### afterLoad (`origin`, `destination`, `direction`, `trigger`)\nLe callback est déclenché une fois que les sections ont été chargées, après la fin du défilement.\nParamètres :\n\n- `origin` : *(Objet)* section d'origine.\n- `destination` : *(Objet)* section de destination.\n- `direction` : *(Chaîne)* elle prendra les valeurs `up` ou `down` selon la direction de défilement.\n\nExemple :\n\n```javascript\nnew fullpage('#fullpage', {\n\tdes ancres : ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\n\n\tafterLoad : function(origine, destination, direction, trigger){\n\t\tvar origin = this;\n\n\t\t//indice d'utilisation\n\t\tif(origin.index == 2){\n\t\t\talert(\"Section 3 a terminé le chargement\") ;\n\t\t}\n\n\t\t//utilisation de anchorLink\n\t\tif(origin.anchor == 'secondSlide'){\n\t\t\talert(\"Section 2 a terminé le chargement\") ;\n\t\t}\n\t}\n}) ;\n```\n\nExemple:s\n\n```javascript\nnew fullpage('#fullpage', {\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\n\n\tafterLoad: function(origin, destination, direction, trigger){\n\t\tvar origin = this;\n\n\t\t//using index\n\t\tif(origin.index == 2){\n\t\t\talert(\"Section 3 ended loading\");\n\t\t}\n\n\t\t//using anchorLink\n\t\tif(origin.anchor == 'secondSlide'){\n\t\t\talert(\"Section 2 ended loading\");\n\t\t}\n\t}\n});\n```\n---\n#### onLeave (`origin`, `destination`, `direction`, `trigger`)\nCe callback est déclenché dès que l'utilisateur quitte une section, dans la transition vers la nouvelle section.\nSi vous retournez `false`, le coup sera annulé avant qu'il n'ait lieu.\n\nParamètres :\n\n- `origine` : *(Objet)* Section d'origine .\n- `destination` : *(Objet)* Section de destination.\n- `direction` : *(Chaîne de caractères)* il prendra les valeurs `up` ou `down` en fonction du sens de défilement.\n\nExemple :\n\n```javascript\nnew fullpage('#fullpage', {\n\tonLeave : function(origine, destination, direction, trigger){\n\t\tvar leavingSection = this;\n\n\t\t//après avoir quitté la section 2\n\t\tif(origin.index == 1 && direction ==='down'){\n\t\t\talert(\"Aller à la section 3 !\");\n\t\t}\n\n\t\telse if(origin.index == 1 && direction =='up'){\n\t\t\talert(\"Aller à la section 1 !\");\n\t\t}\n\t}\n}) ;\n```\n\n\n---\n### beforeLeave (`origin`, `destination`, `direction`, `trigger`)\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback is fired right **before** leaving the section, just before the transition takes place.\n\nYou can use this callback to prevent and cancel the scroll before it takes place by returning `false`.\n\nParameters:\n\n- `origin`:  *(Object)* section of origin.\n- `destination`: *(Object)* destination section.\n- `direction`: *(String)* it will take the values `up` or `down` depending on the scrolling direction.\n- `trigger`: *(String)* indicates what triggered the scroll. It can be: \"wheel\", \"keydown\", \"menu\", \"slideArrow\", \"verticalNav\", \"horizontalNav\".\n\nExample:\n\n```javascript\n\nvar cont = 0;\nnew fullpage('#fullpage', {\n\tbeforeLeave: function(origin, destination, direction, trigger){\n\n\t\t// prevents scroll until we scroll 4 times\n\t\tcont++;\n\t\treturn cont === 4;\n\t}\n});\n```\n\n---\n### afterRender()\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Ce callback est déclenché juste après la génération de la structure de la page. C'est le callback que vous voulez utiliser pour initialiser d'autres plugins ou lancer tout code qui nécessite que le document soit prêt (car ce plugin modifie le DOM pour créer la structure résultante). Voir [FAQs](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions) pour plus d'informations.\n\nExemple :\n\n```javascript\nnew fullpage('#fullpage', {\n\tafterRender : function(){\n\t\tvar pluginContainer = this ;\n\t\talert(\"La structure DOM résultante est prête\");\n\t}\n}) ;\n```\n---\n### afterResize(`largeur`, `hauteur`)\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Ce rappel est déclenché après le redimensionnement de la fenêtre du navigateur. Juste après le redimensionnement des sections.\n\nParamètres :\n\n- `Largeur` : *(Nombre)*  Largeur de la fenêtre.\n- `Hauteur` : *(Nombre)* Hauteur de la fenêtre.\n\nExemple :\n\n```Javascript\nnew fullpage('#fullpage', {\n\tafterResize : function(largeur, hauteur){\n\t\tvar fullpageContainer = this;\n\t\talert(\"Le redimensionnement des sections est terminé\");\n\t}\n}) ;\n```\n---\n### afterReBuild()\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Ce rappel est lancé après la reconstruction manuelle de fullpage.js en appelant `fullpage_api.reBuild()`.\n\nExemple :\n\n```javascript\nnew fullpage('#fullpage', {\n\tafterReBuild : function(){\n\t\tconsole.log(\"fullPage.js a été reconstruit manuellement\");\n\t}\n}) ;\n```\n---\n### afterResponsive(`isResponsive`)\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Ce callback est déclenché après le passage de fullpage.js du mode normal au mode réactif ou du mode réactif au mode normal.\n\nParamètres :\n\n- ìsResponsive : *(Booléen)* détermine s'il entre en mode réactif (`true`) ou retourne en mode normal (`false`).\n\nExemple :\n\n```javascript\nnew fullpage('#fullpage', {\n\tafterResponsive : function(isResponsive){\n\t\talert(\"Is responsive : \" + isResponsive);\n\t}\n}) ;\n```\n---\n### afterSlideLoad (`section`), `origine`, `destination`, `direction`, `trigger`)\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Callback tiré une fois que la diapositive d'une section a été chargée, après que le défilement soit terminé.\n\nParamètres :\n\n- `section` : *(Objet)* Section verticale active.\n- `Origin` : *(Objet)* Diapositive horizontale d'origine.\n- `destination` : *(Objet)* Diapositive horizontale de destination.\n- `direction` : *(Chaîne)* `à droite` ou `à gauche` selon le sens de défilement.\n\n\nExemple :\n\n```Javascript\nnew fullpage('#fullpage', {\n\tanchors : 'firstPage','secondPage','thirdPage','fourthPage','lastPage'],\n\n\tafterSlideLoad : function( section, origin, destination, direction, trigger){\n\t\tvar loadedSlide = this;\n\n\t\t//première diapositive de la deuxième section\n\t\tif(section.anchor =='secondPage' && destination.index == 1){\n\t\t\talert(\"Première diapositive chargée\");\n\t\t}\n\n\t\t//seconde diapositive de la deuxième section (en supposant que #secondSlide est le\n\t\t//anchor pour la deuxième diapositive)\n\t\tif(section.index == 1 && destination.anchor =='secondSlide'){\n\t\t\talert(\"Deuxième diapositive chargée\");\n\t\t}\n\t}\n}) ;\n```\n\n\n---\n### onSlideLeave (`section`, `origine`, `destination`, `direction`, `trigger`)\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Ce callback est déclenché une fois que l'utilisateur quitte une glissière pour aller vers une autre, dans la transition vers la nouvelle glissière.\nSi vous retournez `false', le coup sera annulé avant qu'il n'ait lieu.\n\nParamètres :\n\n- `section` : *(Objet)* Section verticale active .\n- `Origin` : *(Objet)* Diapositive horizontale d'origine.\n- `destination` : Diapositive horizontale de destination *(Objet)*.\n- `direction` : *(Chaîne)* `à droite` ou `à gauche` selon le sens de défilement.\n\nExemple :\n\n```javascript\nnew fullpage('#fullpage', {\n\tonSlideLeave : function( section, origine, destination, direction, trigger){\n\t\tvar leavingSlide = this;\n\n\t\t//en laissant la première diapositive de la 2ème section vers la droite\n\t\tif(section.index == 1 && origine.index == 0 && direction =='right'){\n\t\t\talert(\"Quitter la première diapositive!!\");\n\t\t}\n\n\t\t//en laissant la 3ème diapositive de la 2ème section vers la gauche\n\t\tif(section.index == 1 && origine.index == 2 && direction =='left'){\n\t\t\talert(\"Going to slide 2 !\");\n\t\t}\n\t}\n}) ;\n```\n\n#### Annuler un coup avant qu'il n'ait lieu\nVous pouvez annuler un coup en retournant `false` sur le callback `onSlideLeave`. [Identique à l'annulation d'un mouvement avec `onLeave`](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french/#annuler-le-parchemin-avant-quil-nait-lieu).\n\n\n---\n### onScrollOverflow (`section`, `slide`, `position`, `direction`)\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback gets fired when a scrolling inside a scrollable section when using the fullPage.js option `scrollOverflow: true`.\n\nParameters:\n\n- `section`: *(Object)* active vertical section.\n- `slide`: *(Object)* horizontal slide of origin.\n- `position`: *(Integer)* scrolled amount within the section/slide. Starts on 0.\n- `direction`: *(String)* `up` or `down`\n\nExample:\n\n```javascript\nnew fullpage('#fullpage', {\n\tonScrollOverflow: function( section, slide, position, direction){\n\t\tconsole.log(section);\n\t\tconsole.log(\"position: \" + position);\n\t}\n});\n```\n\n# Signaler les problèmes\n1. S'il vous plaît, cherchez votre problème avant de demander à l'aide de la recherche de problèmes github.\n2. Assurez-vous d'utiliser la dernière version de fullpage.js. Aucun support n'est fourni pour les anciennes versions.\n3. Utilisez [le forum Github Issues] (https://github.com/alvarotrigo/fullPage.js/issues) pour créer des problèmes.\n4. **Une reproduction isolée du numéro sera exigée.** Si possible, utilisez[jsfiddle](https://jsfiddle.net/alvarotrigo/ea17skjr/) ou[codepen](https://codepen.io/alvarotrigo/pen/qqabrp) pour cela.\n\n# Contribuer à fullpage.js\nVeuillez consulter[Contribuer à fullpage.js] (https://github.com/alvarotrigo/fullPage.js/wiki/Contributing-to-fullpage.js)\n\n# Changelog\nPour voir la liste des changements récents, voir la section[Communiqués] (https://github.com/alvarotrigo/fullPage.js/releases).\n\n# Build tasks\nVous voulez créer des fichiers de distribution fullpage.js ? Veuillez consulter [Tâches de construction](https://github.com/alvarotrigo/fullPage.js/wiki/Build-tasks)\n\n# Ressources\n- Wordpress Plugin [for Gutenberg](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/) and [for Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/).\n- [Thème Wordpress](https://alvarotrigo.com/fullPage/utils/wordpress.html)\n- [composant d'emballage officiel de Vue.js](https://github.com/alvarotrigo/vue-fullpage.js)\n- [composant d'emballage officiel de React.js](https://github.com/alvarotrigo/react-fullpage)\n- [Composant d'emballage angulaire officiel](https://github.com/alvarotrigo/angular-fullpage)\n- [CSS Easing Animation Tool - Matthew Lein](https://matthewlein.com/ceaser/) (utile pour définir la valeur `easingcss3`)\n- [fullPage.js jsDelivr CDN](https://www.jsdelivr.com/package/npm/fullpage.js)\n- [plugin fullPage.js pour octobre CMS](https://github.com/freestream/oc-parallax-plugin)\n- [Directive fullPage.js Angular2](https://github.com/meiblorn/ng2-fullpage)\n- [directive angulaire fullPage.js](https://github.com/hellsan631/angular-fullpage.js)\n- [fullPage.js ember-cli addon](https://www.npmjs.com/package/ember-cli-fullpagejs)\n- [fullPage.js Rails Ruby Gem](https://rubygems.org/gems/fullpagejs-rails)\n- [Angular fullPage.js - Adaptation for Angular.js v1.x](https://github.com/mmautomatizacion/angular-fullpage.js)\n- [Intégration de fullPage.js avec Wordpress (Tutoriel)](https://premium.wpmudev.org/blog/build-apple-inspired-full-page-scrolling-pages-for-your-wordpress-site/)\n\n## Qui utilise fullPage.js\n\n![Who is using fullPage.js](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/using-fullpage.png)\n\n- http://www.bbc.co.uk/news/resources/idt-d88680d1-26f2-4863-be95-83298fd01e02\n- http://medoff.ua/en/\n- http://promo.prestigio.com/grace1/\n- http://torchbrowser.com/\n- http://www.boxreload.com/\n- http://boxx.hk/\n- http://www.villareginateodolinda.it\n\n## Les sponsors\nDevenez sponsor et obtenez votre logo dans notre README sur GitHub avec un lien vers votre site. [[Contactez-nous](https://alvarotrigo.com/#contact)] | [[Devenez un Patreon]](https://www.patreon.com/fullpagejs) | [Devenez un sponsor GitHub](https://github.com/sponsors/alvarotrigo)\n\n\n[![Warp](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/warp.png)](http://go.warp.dev/fullPage)\n[![Crawlbase](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/crawlbase.png)](https://crawlbase.com/?utm_source=github&utm_medium=sponsor&utm_campaign=fullpagejs)\n[![TestMu](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/testmu-ai.png)](https://www.testmu.com/?utm_source=fullpagejs&utm_medium=sponsor)\n[![Codeless](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codeless.png)](https://codeless.co)\n[![Stackpath](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/stackpath3.png)](https://www.stackpath.com/)\n[![Browserstack](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/browserstack3.png)](http://www.browserstack.com/)\n[![CodePen](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codepen3.png)](https://codepen.com)\n\n### Gens\n<a href=\"https://github.com/donsalvadori\" target=\"_blank\" rel=\"nofollow\">\n\t<img src=\"http://wallpapers-for-ipad.com/fullpage/imgs3/avatars/donsalvadori.jpg\">\n</a>\n\n## Contributors\n\n<a href=\"https://github.com/alvarotrigo/fullPage.js/graphs/contributors\">\n  <img src=\"https://contrib.rocks/image?repo=alvarotrigo/fullPage.js&max=400&columns=25&anon=1&v=2\" />\n</a>"
  },
  {
    "path": "lang/french/how-to-activate-fullpage-extension.md",
    "content": "# How to activate a fullPage.js extension \n\n1. Accédez à https://alvarotrigo.com/fullPage/extensions/activationKey.html. (Quelle est l'URL qui a été envoyée à votre adresse email lors de l'achat de l'extension)\n1. Présentez la **clé de licence** qui vous a été remise lors de l'achat de l'article. Aussi disponible dans votre courriel de confirmation d'achat.\n1. Un nom de domaine peut être requis afin d'obtenir la **clé d'activation** de votre produit.\n1. Une fois que vous avez la **clé d'activation** de votre extension et domaine (générée lors des étapes précédentes) vous devrez ajouter une option dans l'initialisation de fullpage.js sous la forme `nomDeLextension + \"Clé\" : key`.\n\nPar exemple :\n\n```javascript\nnew fullPage('#fullpage', {\n    fadingEffect : true,\n    fadingEffectKey:'ACTIVATION KEY DEVRAIT ÊTRE ICI',\n}) ;\n```\n\nIdem pour le reste des extensions si vous les utilisez.\nCe sont toutes les options de la clé d'extension pour le moment :\n\n* `fadingEffectKey`\n* `responsiveSlidesKey`\n* `continuousHorizontalKey`\n* `interlockedSlidesKey`\n* `scrollHorizontallyKey`\n* `resetSlidersKey`\n* `offsetSectionsKey`\n* `dragAndMoveKey`\n* `parallaxKey`\n\nRappelez-vous que l'utilisation d'extensions nécessite l'utilisation de[`fullpage.extensions.min.js`](https://github.com/alvarotrigo/fullPage.js/blob/master/dist/fullpage.extensions.min.js) au lieu du fichier fullPage.js habituel (`fullpage.js`) comme expliqué dans[utilisation des extensions](https://github.com/alvarotrigo/fullPage.js#use-extensions).\n\n### Que faire pour les environnements de développement / sites Web ?\nAucune clé d'activation n'est nécessaire pour localhost et 127.0.0.0.1. Tout autre domaine de staging nécessitera une licence (Professionnel ou Business) qui permettra de générer une nouvelle clé pour ceux-ci.\n\nSi vous avez une licence qui vous permet de générer plusieurs clés d'activation, vous pouvez utiliser le même code JS pour toutes. Dans ce cas, vous pouvez utiliser un tableau avec les différentes clés pour chaque domaine, par exemple, si nous utilisons l'extension `scrollHorizontally` pour 3 domaines, nous pouvons faire ce qui suit :\n\n```js\nnew fullPage('#fullpage', {\n    scrollHorizontalement : true,\n    défilementHorizontalementClé : ['domain1_key','domain2_key','domain3_key'].\n}) ;\n```\n\nDe cette façon, l'extension peut être utilisée dans n'importe lequel de ces 3 domaines.\n\n### Clé de licence vs clé d'activation\nLes deux sont des clés différentes.\n- Vous obtenez la **clé de licence** lors de l'achat d'une extension.\n- Vous obtenez la **clé d'activation**  lorsque vous activez votre extension pour un domaine particulier (sauf si vous utilisez la Business License). Pour le générer, vous avez besoin de la **clé de licence**.\n\nLa clé de licence est composée de 4 groupes de 8 caractères chacun (`XXXXXXXXXXXX-XXXXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX`) et la clé d'activation a une longueur variable et elle n'est pas composée de groupes séparés (`XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`)\nIl est important de ne pas s'embrouiller les uns les autres."
  },
  {
    "path": "lang/french/parallax-extension.md",
    "content": "# Parallax extension \n\n![](https://cloud.githubusercontent.com/assets/1706326/23580315/f28edab4-00f6-11e7-90f9-81ffafd77b0e.gif)\n\nLisez [Utilisation des extensions](https://github.com/alvarotrigo/fullPage.js#use-extensions) avant d'utiliser l'option parallaxe.\n- [Démo en direct](http://alvarotrigo.com/fullPage/extensions/parallax.html)\n- [Structure HTML requise](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax#required-html-structure)\n- [Application de l'arrière-plan](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax#applying-the-background)\n- [Options](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax#options)\n  - [Options de l'effet parallax](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax#parallax-effect-options)\n- [Méthodes](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax#methods)\n\n## HTML\nAfin d'utiliser l'effet parallaxe dans les sections et les diapositives, un nouvel élément devra être ajouté avec la classe `fp-bg`. Il devrait s'agir d'un `div` vide placé comme premier enfant de la section ou de la diapositive. Comme ce qui suit :\n\n```html\n<div class=\"fp-bg\"></div>\n```\n\nCe serait l'élément auquel vous devrez appliquer le fond au lieu de la section ou des diapositives à laquelle il appartient.\n\nPar exemple :\n```html\n<div id=\"fullpage\">\n    <div class=\"section\" id=\"section1\">\n      <div class=\"fp-bg\"></div>\n        Diapositive 1.1\n      </div>\n    <div class=\"section\" id=\"section2\">\n        <div class=\"slide\" id=\"slide2-1\">\n          <div class=\"fp-bg\"></div>\n            Diapositive 2.1\n        </div>\n        <div class=\"slide\" id=\"slide2-2\">\n            <div class=\"fp-bg\"></div>\n            Diapositive 2.2\n        </div>\n    </div>\n</div>\n```\n\nCette structure peut être vue dans le code source de\n [la page de démonstration de parallax](http://alvarotrigo.com/fullPage/extensions/parallax.html).\n\n> Si pour une raison quelconque vous ne voulez pas ajouter un nouvel élément dans votre mise en page, vous pouvez définir l'option `property` dans `parallaxOptions` sur `background` afin d'appliquer l'effet à la section courante ou au fond de diapositive.\n> Comme expliqué dans Options de l'effet Parallax, je ne recommande de le faire que si c'est vraiment nécessaire, car les performances ne seront pas les mêmes que lors de l'utilisation des éléments `fp-bg`.\n\n<br>\n\n## Appliquer l'arrière-plan\nL'arrière-plan doit être appliqué à l'élément `fp-bg` de la même manière que vous l'appliqueriez à une section ou une diapositive.\nVous pouvez utiliser le CSS ou le style en ligne.\n\nPar exemple :\n```css\n#section1.fp-bg{\n    background-image : url('imgs/alvaro-genious.jpg') ;\n    background-size : cover;\n    background-position : center 80% ;\n}\n```\n## Options\n\n| Option | Description |\n| ------------- | ------------- |\n| **Parallax** | (par défaut `false`). [Extension de fullPage.js](http://alvarotrigo.com/fullPage/extensions/). Définit s'il faut ou non utiliser les effets de fond de parallax sur les sections / diapositives.  |\n| **parallaxOptions:** | (par défaut : `{ type:'reveal', percentage: 62, property:'translate'}`). Permet de configurer les paramètres de l'effet de fond de parallax lors de l'utilisation de l'option `parallax:true`.  |\n<br>\n\n### Options de l'effet parallax\nVous pouvez les voir en action [dans la page de démonstration](http://alvarotrigo.com/fullPage/extensions/parallax.html)\n\nDescription des options configurables disponibles dans l'option `parallaxOptions` :\n\n| parallaxOptions | Description |\n| ------------- | ------------- |\n| **type** | (par défaut `reveal`) Les valeurs possibles sont `cover` et `reveal`. Permet de choisir si la section/la diapositive en cours sera supérieure ou inférieure à celle de destination. Lorsque vous utilisez le `cover`, la section ou la diapositive suivante apparaîtra couvrant une partie de la section ou de la diapositive en cours. L'utilisation de `reveal` inversera simplement l'effet et couvrira un peu celui de la destination tout en le révélant.  |\n| **percentage** | (`62` par défaut) permettent de définir le pourcentage de l'effet parallax par rapport à la fenêtre. Avoir une valeur plus petite aura un effet de parallaxe plus petit, et avoir 100, qui est le maximum, montrera des fonds complètement statiques.   |\n| **property** | Les valeurs possibles sont `translate` et `background`. Définit si nous voulons appliquer l'effet parallax à l'élément `fp-bg` ou directement à la propriété de fond de la section ou de la diapositive.  Il est recommandé d'utiliser la valeur par défaut pour cette option.\n\n\nNotez que l'utilisation de l'élément `fp-bg` fournit une bien meilleure performance car il utilise l'accélération matérielle translate3d. L'option est là pour ceux qui, pour une raison particulière, ne veulent pas ajouter l'élément supplémentaire `fp-bg` dans chaque section ou diapositive ou ne peuvent simplement pas modifier le balisage HTML.\n\n## Méthodes\nVous pouvez les voir en action [dans la page de démonstration](http://alvarotrigo.com/fullPage/extensions/parallax.html)\n\n#### setOption(nomEnOption, valeur)\nDéfinit une valeur pour une option donnée. `nomEnOption` peut être l'une quelconque des options disponibles dans `parallaxOptions`. (`type`, `pourcentage` ou `bien`).\n```javascript\nmodifier la valeur de la propriété `type`\nfullpage_api.parallax.setOption('type','cover') ;\n\nmodification de la valeur de la propriété `pourcentage`\nfullpage_api.parallax.setOption('percentage','30');\n```\n---\n### destroy()\nÉteint l'effet paralax.\n```javascript\nfullpage_api.parallax.destroy();\n```"
  },
  {
    "path": "lang/japanese/README.md",
    "content": "# fullPage.js\n![preview](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/intro.png)\n![compatibility](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/compatible.png)\n\n<p align=\"center\">\n  <a href=\"https://github.com/alvarotrigo/fullPage.js\">English</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish#fullpagejs\">Español</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#fullpagejs\">Français</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian#fullpagejs\">Pусский</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese#fullpagejs\">中文</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#fullpagejs\">한국어</a> | \n  <span>日本語</span> | \n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese#fullpagejs\">Português Brasileiro</a>\n</p>\n\n<p align=\"center\">\n\tAvailable for <a href=\"https://github.com/alvarotrigo/vue-fullpage.js\">Vue</a>, <a href=\"https://github.com/alvarotrigo/react-fullpage\">React</a> and <a href=\"https://github.com/alvarotrigo/angular-fullpage\">Angular</a>.\n</p>\n\n---\n\n![fullPage.js version](https://img.shields.io/badge/fullPage.js-v4.0.41-brightgreen.svg)\n[![License](https://img.shields.io/badge/License-GPL-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.html)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/fullpage.js/badge?style=rounded)](https://www.jsdelivr.com/package/npm/fullpage.js)\n[![Minzipped Size](https://img.shields.io/bundlephobia/minzip/fullpage.js)](https://bundlephobia.com/package/fullpage.js)\n&nbsp;&nbsp;**|**&nbsp;&nbsp; *Created by [@imac2](https://twitter.com/imac2)*\n\n- [Demo online](https://alvarotrigo.com/fullPage/) | [Codepen](https://codepen.io/alvarotrigo/pen/qqabrp)\n- [Wordpress plugin for Gutenberg](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/) and [WordPress plugin for Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/)\n- [Wordpress theme](https://alvarotrigo.com/fullPage/utils/wordpress.html)\n- [fullpage.js Extensions](https://alvarotrigo.com/fullPage/extensions/)\n- [Frequently Answered Questions](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions)\n- [[Migration from fullPage v3 to fullpage v4]](https://alvarotrigo.com/fullPage/help/migration-from-fullpage-3/)\n---\n\nfullPage.jsはシンプルで使いやすいライブラリで、全画面のスクロールページ（シングルページウェブサイトまたはワンページサイトとも呼ばれます）を作成できます。  \nまた、サイトのそれぞれのセクション内に横向きのスライダーを追加することも可能です。\n\n- [はじめに](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#はじめに)\n- [互換性](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#互換性)\n- [ライセンス](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#ライセンス)\n- [使用方法](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#使用方法)\n  - [セクションやスライドへのリンク作成](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#セクションやスライドへのリンク作成)\n  - [小さなセクションや大きなセクションの作成](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#小さなセクションや大きなセクションの作成)\n  - [fullpage.jsによって追加される状態クラス](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#fullpage.jsによって追加される状態クラス)\n  - [遅延読み込み](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#遅延読み込み)\n  - [埋め込まれたメディアの自動再生/一時停止](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#埋め込まれたメディアの自動再生/一時停止)\n  - [拡張機能の使用](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#拡張機能の使用)\n- [オプション](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#オプション)\n- [メソッド](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#メソッド)\n- [コールバック](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#コールバック)\n- [問題の報告](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#問題の報告)\n- [fullpage.jsへの貢献](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#fullpage.jsへの貢献)\n- [変更履歴](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#変更履歴)\n- [ビルドタスク](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#ビルドタスク)\n- [リソース](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#リソース)\n- [fullpage.jsを使用しているサイト](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/fullpage.jsを使用しているサイト)\n- [寄付](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#寄付)\n- [スポンサー](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#スポンサー)\n\n## はじめに\n機能の要望だけでなく、コーディングスタイルの改善についても提案を歓迎します。\n皆さんの生産性を向上するために、素晴らしいライブラリにしましょう！\n\n## 互換性\nfullPage.jsはすべての最新ブラウザおよびIE 11で完全に機能します。IE < 11をサポートする必要がある場合は、[fullPage.js v3](https://github.com/alvarotrigo/fullPage.js/tree/3.1.2)を使用してください。\nまた、スマートフォン、タブレット、タッチパネルディスプレイもサポートしています。\n\nfullpage.jsをサポートしてくれる[Browserstack](https://www.browserstack.com/)に多大なる感謝を申し上げます。\n\n## ライセンス\n\n### 商用ライセンス\nfullPageを使用して非オープンソースのサイト、テーマ、プロジェクト、アプリケーションを開発したい場合は、商用ライセンスが適切です。このオプションでは、ソースコードはプロプライエタリとして保持されます。つまり、アプリケーションの全ソースコードをオープンソースライセンスに変更する必要はありません。[Fullpage商用ライセンスの購入](https://alvarotrigo.com/fullPage/pricing/)\n\n### オープンソースライセンス\nGNU GPL v3ライセンスと互換性のあるオープンソースアプリケーションを作成している場合は、GPLv3の条件に基づいてfullPageを使用することができます。\n\n**fullPage.jsが使用されていることを明示的に示す必要があります。JavaScriptおよびCSSファイルのクレジットコメントはそのまま残してください。**（他ソースコードとの結合やミニファイ後も）\n\n[fullPageのライセンスについて詳しく読む](https://alvarotrigo.com/fullPage/pricing/)\n\n## 使用方法\n例のファイルでわかるように、以下を含める必要があります：\n - JavaScriptファイル `fullpage.js`（またはその最小化バージョン `fullpage.min.js`）\n - CSSファイル `fullpage.css`\n\n **オプション** `css3:false`を使用する場合、ライブラリに含まれているイージング効果（`easeInOutCubic`）以外の効果を使用したい場合は、[easingsファイル](https://github.com/alvarotrigo/fullPage.js/tree/master/vendors/easings.min.js)を追加してください。\n\n### bowerまたはnpmを使用してインストール\n**オプション** 要に応じてfullPage.jsをbowerまたはnpmでインストールできます。\n\nターミナル：\n```shell\n// bowerを使用\nbower install fullpage.js\n\n// npmを使用\nnpm install fullpage.js\n```\n\n### ファイルのインクルード\n```html\n<link rel=\"stylesheet\" type=\"text/css\" href=\"fullpage.css\" />\n\n<!-- 次の行はオプションです。css3:falseオプションを使用し、\"easeInOutCubic\"以外のイージング効果を使用したい場合にのみ必要です。 -->\n<script src=\"vendors/easings.min.js\"></script>\n\n<script type=\"text/javascript\" src=\"fullpage.js\"></script>\n```\n\nWebpack、Browserify、またはRequire.jsを使用している場合は、[モジュールローダーを使用したfullPage.jsの使い方](https://github.com/alvarotrigo/fullPage.js/wiki/Use-module-loaders-for-fullPage.js)を確認してください。\n\n### オプション CDNの使用\nCDNを使用してfullPage.jsを利用したい場合、[JSDelivr](https://www.jsdelivr.com/package/npm/fullpage.js)、[UNPKG](https://unpkg.com/browse/fullpage.js/dist/)、[CDNJS](https://cdnjs.com/libraries/fullPage.js) を利用できます。\n\n\n### 必須HTML構造\nHTML文書をHTMLの[DOCTYPE宣言](https://www.corelangs.com/html/introduction/doctype.html)で始めます。  \nそうしないと、セクションの高さに問題が発生する可能性があります。  \n提供された例ではHTML 5のDOCTYPE `<!DOCTYPE html>`を使用しています。\n\n各セクションは`section`クラスを含む要素で定義します。\nデフォルトではアクティブなセクションは最初のセクションで、これは最初に表示されるページとなります。\n\nセクションはラッパー（この場合は`<div id=\"fullpage\">`）内に配置する必要があります。  \n`body`要素はラッパーとして指定できません。\n\n```html\n<div id=\"fullpage\">\n\t<div class=\"section\">Some section</div>\n\t<div class=\"section\">Some section</div>\n\t<div class=\"section\">Some section</div>\n\t<div class=\"section\">Some section</div>\n</div>\n```\n\nアクティブとするセクションを最初のセクションやセクションの最初のスライドから変更したい場合は、  \nアクティブにしたいセクションやスライドにクラス`active`を追加します。\n\n```html\n<div class=\"section active\">Some section</div>\n```\n\nセクション内に横向きのスライダーを作成するには、`slide`クラスを含む要素で定義します。\n\n```html\n<div class=\"section\">\n\t<div class=\"slide\"> Slide 1 </div>\n\t<div class=\"slide\"> Slide 2 </div>\n\t<div class=\"slide\"> Slide 3 </div>\n\t<div class=\"slide\"> Slide 4 </div>\n</div>\n```\n\nHTML構造の詳細な例は[`simple.html`ファイル](https://github.com/alvarotrigo/fullPage.js/blob/master/examples/simple.html)で確認できます。\n\n### 初期化\n\n#### Vanilla Javascriptでの初期化\n`</body>`タグの直前で`<script>`タグを利用して、fullPage.jsを呼び出すだけです。\n\n```javascript\nnew fullpage('#fullpage', {\n\t//オプションはここに\n\tautoScrolling: true,\n\tscrollHorizontally: true\n});\n```\n\n#### jQueryでの初期化\nfullpage.jsをjQueryプラグインとして使用することもできます！\n\n```javascript\n$(document).ready(function() {\n\t$('#fullpage').fullpage({\n\t\t//オプションはここに\n\t\tautoScrolling: true,\n\t\tscrollHorizontally: true\n\t});\n\n\t// fullpage.jsメソッドの使用例\n\t$.fn.fullpage.setAllowScrolling(false);\n});\n```\n\n#### すべてのオプションを設定したVanilla JSの例\nすべてのオプションを設定したより複雑な初期化は次のようになります。\n```javascript\n\nvar myFullpage = new fullpage('#fullpage', {\n\t// ナビゲーション\n\tmenu: '#menu',\n\tlockAnchors: false,\n\tanchors:['firstPage', 'secondPage'],\n\tnavigation: false,\n\tnavigationPosition: 'right',\n\tnavigationTooltips: ['firstSlide', 'secondSlide'],\n\tshowActiveTooltip: false,\n\tslidesNavigation: false,\n\tslidesNavPosition: 'bottom',\n\n\t// スクロール\n\tcss3: true,\n\tscrollingSpeed: 700,\n\tautoScrolling: true,\n\tfitToSection: true,\n\tfitToSectionDelay: 600,\n\tscrollBar: false,\n\teasing: 'easeInOutCubic',\n\teasingcss3: 'ease',\n\tloopBottom: false,\n\tloopTop: false,\n\tloopHorizontal: true,\n\tcontinuousVertical: false,\n\tcontinuousHorizontal: false,\n\tscrollHorizontally: false,\n\tinterlockedSlides: false,\n\tdragAndMove: false,\n\toffsetSections: false,\n\tresetSliders: false,\n\tfadingEffect: false,\n\tnormalScrollElements: '#element1, .element2',\n\tscrollOverflow: true,\n\tscrollOverflowMacStyle: false,\n\tscrollOverflowReset: false,\n\ttouchSensitivity: 15,\n\tbigSectionsDestination: null,\n\tadjustOnNavChange: true,\n\n\t// アクセシビリティ\n\tkeyboardScrolling: true,\n\tanimateAnchor: true,\n\trecordHistory: true,\n\n\t// デザイン\n\tcontrolArrows: true,\n\tcontrolArrowsHTML: [\n\t\t'<div class=\"fp-arrow\"></div>', \n\t\t'<div class=\"fp-arrow\"></div>'\n\t],\n\tverticalCentered: true,\n\tsectionsColor : ['#ccc', '#fff'],\n\tpaddingTop: '3em',\n\tpaddingBottom: '10px',\n\tfixedElements: '#header, .footer',\n\tresponsiveWidth: 0,\n\tresponsiveHeight: 0,\n\tresponsiveSlides: false,\n\tcinematic: false,\n\tcinematicOptions: [Object],\n\teffects: false,\n\teffectsOptions: [Object],\n\tparallax: false,\n\tparallaxOptions: { type: 'reveal', percentage: 62, property: 'translate' },\n\tdropEffect: false,\n\tdropEffectOptions: { speed: 2300, color: '#F82F4D', zIndex: 9999 },\n\twaterEffect: false,\n\twaterEffectOptions: { animateContent: true, animateOnMouseMove: true },\n\tcards: false,\n\tcardsOptions: { perspective: 100, fadeContent: true, fadeBackground: true },\n\n\t// カスタムセレクター\n\tsectionSelector: '.section',\n\tslideSelector: '.slide',\n\n\tlazyLoading: true,\n\tlazyLoadThreshold: 0,\n\tobserver: true,\n\tcredits: { enabled: true, label: 'Made with fullPage.js', position: 'right' },\n\n\t// イベント\n\tbeforeLeave: function(origin, destination, direction, trigger){},\n\tonLeave: function(origin, destination, direction, trigger){},\n\tafterLoad: function(origin, destination, direction, trigger){},\n\tafterRender: function(){},\n\tafterResize: function(width, height){},\n\tafterReBuild: function(){},\n\tafterResponsive: function(isResponsive){},\n\tafterSlideLoad: function(section, origin, destination, direction, trigger){},\n\tonSlideLeave: function(section, origin, destination, direction, trigger){}\n});\n```\n\n### セクションやスライドへのリンク作成\nセクションのアンカーリンクを使用している場合（`anchors`オプションまたは各スライドの`data-anchor`属性を使用）、  \nセクション内の特定のスライドに直接移動するためのアンカーリンクも使用できます。\n\n以下がアンカー付きのリンクの例です。  \nhttps://alvarotrigo.com/fullPage/#secondPage/2（手動でそのセクション/スライドにアクセスすると表示されるURL）  \nURLの最後の部分は`#secondPage/2`で終わります。\n\n次の初期化を行うと：\n\n```javascript\nnew fullpage('#fullpage', {\n\tanchors:['firstPage', 'secondPage', 'thirdPage']\n});\n```\n\nURLの末尾にあるアンカー`#secondPage/2`はそれぞれセクションとスライドの位置を示します。  \n`#secondPage/2`の場合、セクションはアンカー`secondPage`で定義されたもので、スライドはインデックス`2`であるためため2番目のスライドになります。（セクションの最初のスライドはインデックス0となります）。\n\nHTMLマークアップで`data-anchor`属性を使用すると、インデックスの代わりにカスタムアンカーをスライドに使用できます。  \n例：\n\n```html\n<div class=\"section\">\n\t<div class=\"slide\" data-anchor=\"slide1\"> Slide 1 </div>\n\t<div class=\"slide\" data-anchor=\"slide2\"> Slide 2 </div>\n\t<div class=\"slide\" data-anchor=\"slide3\"> Slide 3 </div>\n\t<div class=\"slide\" data-anchor=\"slide4\"> Slide 4 </div>\n</div>\n```\nこの場合、使用するURLは`#secondPage/slide3`で、前の`#secondPage/2`と同等です。\n\nセクションアンカーも同様に定義でき、`anchors`配列が提供されていない場合は`data-anchor`属性を使用します。\n\n**注意！** `data-anchor`タグの値は、サイト上の任意のID要素（またはIEのNAME要素）と同じ値を持つことはできません。\n\n### 小さなセクションや大きなセクションの作成\n\n[デモ](https://codepen.io/alvarotrigo/pen/BKjRYm) fullPage.jsはセクションやスライドのフルハイト制限(全画面制限)を解除する方法を提供します。  \nこれにより、ビューポートよりも小さいまたは大きいセクションを作成することが可能です。  \nこれはフッターに最適です。\nすべてのセクションにこの機能を適用するのは適切ではありません。  \nすべてのセクションに適用すると、サイトの初期読み込み時に複数のセクションがビューポート内に既に存在するため、fullPage.jsは次のセクションを見るためにうまくスクロールできないかもしれません。\n\nフルハイト(全画面)を解除するには、`fp-auto-height`クラスを適用したいセクションに使用します。  \nセクション/スライドのコンテンツによって定義された高さが適用されます。\n\n```html\n<div class=\"section\">Whole viewport</div>\n<div class=\"section fp-auto-height\">Auto height</div>\n```\n\n#### レスポンシブオートハイトセクション\n[デモ](https://codepen.io/alvarotrigo/pen/MzByMa) レスポンシブオートハイトは`fp-auto-height-responsive`クラスを使用して適用できます。  \nレスポンシブモードが発動するまでセクションはフルスクリーンになります。  \nレスポンシブモードが発動すると、コンテンツに必要なサイズとなります。\n\n### fullpage.jsによって追加される状態クラス\nfullpage.jsはサイトの表示状態を管理するために異なる要素に複数のCSSクラスを追加します。\n\n- `active`は現在表示されているセクションとスライドに追加されます。\n- `active`は現在のメニュー要素（`menu`オプションを使用している場合）に追加されます。\n- `fp-loaded` は、メディアコンテンツの遅延読み込みをトリガーするセクションまたはスライドの要素に追加されます。\n- `fp-viewing-SECTION-SLIDE`形式のクラスがサイトの`body`要素に追加されます。（例：[`fp-viewing-secondPage-0`](https://alvarotrigo.com/fullPage/#secondPage)）`SECTION`および`SLIDE`部分は現在のセクションおよびスライドのアンカー（またはアンカーが提供されていない場合はインデックス）です。\n- レスポンシブモードに入ると`fp-responsive`が`body`要素に追加されます\n- fullPage.jsが有効な場合`html`要素に`fp-enabled`が追加されます。（削除するとうまく動きません）。\n- fullPage.jsが破棄されると`fp-destroyed`がfullpage.jsコンテナに追加されます。\n\n### 遅延読み込み\n[デモ](https://codepen.io/alvarotrigo/pen/eNLBXo) fullPage.jsは画像、動画、および音声要素の遅延読み込み(Lazy Loading)を提供し、サイト読み込みの低速化、不要なデータ転送を抑止可能です。  \n遅延読み込みを使用する場合、要素がビューポートに入ったときにのみ読み込まれます。  \n遅延読み込みを有効にするには、次のように`src`属性を`data-src`に変更するだけです。\n\n```html\n<img data-src=\"image.png\">\n<video>\n\t<source data-src=\"video.webm\" type=\"video/webm\" />\n\t<source data-src=\"video.mp4\" type=\"video/mp4\" />\n</video>\n ```\n\nすでに`data-src`を使用している他の遅延読み込みライブラリなどを使用している場合は、オプション`lazyLoading: false`を設定してfullPage.jsの遅延読み込みを無効にできます。\n\n### 埋め込まれたメディアの自動再生/一時停止\n\n[デモ](https://codepen.io/alvarotrigo/pen/pXEaaK) **注意**：自動再生機能は、OSやブラウザによっては一部のモバイルデバイスで動作しない場合があります（例：[iOSのSafari](https://webkit.org/blog/6784/new-video-policies-for-ios/)バージョン < 10.0）。\n\n#### セクション/スライドの読み込み時に再生：\n動画や音声に対して`autoplay`属性を使用するか、YouTubeのiframeに対して`autoplay=1`パラメータを使用すると、ページの読み込み時にメディア要素が再生されます。\nセクション/スライドの読み込み時に再生するには、代わりに`data-autoplay`属性を使用します。  \n例：\n\n```html\n<audio data-autoplay>\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\n</audio>\n```\n\n#### 離脱時の一時停止\n埋め込まれたHTML5`<video>` / `<audio>`およびYouTubeのiframeは、セクションまたはスライドから離脱すると自動的に一時停止されます。  \nこれを無効にするには、`data-keepplaying`属性を使用します。  \n例：\n\n```html\n<audio data-keepplaying>\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\n</audio>\n```\n\n### 拡張機能の使用\nfullPage.jsはデフォルトの機能を強化するための[さまざまな拡張機能](https://alvarotrigo.com/fullPage/extensions/)を提供しています。  \nすべての拡張機能は[fullpage.jsのオプション](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#オプション)にリストしています。\n\n拡張機能を使用するには、通常のfullPage.jsファイル（`fullpage.js`または`fullpage.min.js`）の代わりに[`fullpage.extensions.min.js`](https://github.com/alvarotrigo/fullPage.js/blob/master/dist/fullpage.extensions.min.js)ファイルを使用する必要があります。\n\n拡張機能ファイルを取得したら、fullPageの前に追加する必要があります。  \nたとえば、Continuous Horizontal拡張機能を使用したい場合は、拡張機能ファイルを追加してから、拡張機能バージョンのfullPageファイルを追加します。\n\n```html\n<script type=\"text/javascript\" src=\"fullpage.continuousHorizontal.min.js\"></script>\n<script type=\"text/javascript\" src=\"fullpage/fullpage.extensions.min.js\"></script>\n```\n\n各拡張機能にはアクティベーションキーとライセンスキーが必要です。[詳細についてはこちらをご覧ください](https://github.com/alvarotrigo/fullPage.js/wiki/How-to-activate-a-fullPage.js-extension)\n\nその後、[オプション](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#オプション)で説明されているように、それらを使用および構成できます。\n\n## オプション\n\n### licenseKey\n \n（デフォルト `null`）**このオプションは必須です。** fullPageを非オープンソースプロジェクトで使用する場合、fullPage商用ライセンスの購入時に提供されたライセンスキーを使用する必要があります。プロジェクトがオープンソースであり、GPLv3ライセンスと互換性がある場合、`gplv3-license`オプションを使用できます。ライセンスについての詳細は[こちら](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#ライセンス)および[ウェブサイト](https://alvarotrigo.com/fullPage/pricing/)をご覧ください。使用例：\n\n```javascript\nnew fullpage('#fullpage', {\n\tlicenseKey: 'あなたのキーをここに入力'\n});\n```\n\n### controlArrows\n\n（デフォルト `true`）スライドを右または左に移動するためのコントロール矢印を使用するかどうかを決定します。\n\n### controlArrowsHTML\n\n（デフォルト `['<div class=\"fp-arrow\"></div>', '<div class=\"fp-arrow\"></div>'],`）\n水平スライド用のコントロール矢印に適用するHTML構造およびクラスを定義する方法を提供します。配列には両方の矢印の構造が含まれます。最初のアイテムは左矢印で、2番目のアイテムは右矢印です。\n\n### verticalCentered\n\n（デフォルト `true`）フレックスボックスを使用してコンテンツを垂直方向に中央に配置します。潜在的な問題を避けるためにコンテンツを`div`でラップすることをお勧めします。（`flex-direction: column; display: flex; justify-content: center;`を使用します）\n\n### scrollingSpeed\n\n（デフォルト `700`）スクロールトランジションの速度（ミリ秒単位）。\n\n### sectionsColor\n\n（デフォルト `none`）各セクションのCSS `background-color`プロパティを定義します。  \n例：\n\n```javascript\nnew fullpage('#fullpage', {\n\tsectionsColor: ['#f2f2f2', '#4BBFC3', '#7BAABE', 'whitesmoke', '#000'],\n});\n```\n\n### anchors\n\n（デフォルト `[]`）各セクションのURLに表示されるアンカーリンク（#example）を定義します。  \nアンカー値は一意である必要があります。 \n配列内のアンカーの位置が、アンカーが適用されるセクションの位置と一致します。（2番目の位置は2番目のセクションに適用されるなど）。  \nアンカーを使用することで、ブラウザの前後ナビゲーションも可能になり、ユーザーは特定のセクションやスライドをブックマークすることができます。  \n**注意！** アンカーはサイト上の任意のID要素（またはIEのNAME要素）と同じ値を持つことはできません。\nアンカーはHTML構造内で`data-anchor`属性を使用して直接定義することもできます。\n\n### lockAnchors\n\n（デフォルト `false`）URL内のアンカーがライブラリに影響を与えるかどうかを決定します。  \nアンカーを内部で自分の関数やコールバックに使用できますが、サイトのスクロールには影響を与えません。  \n他のプラグインとアンカーを組み合わせて使用する場合に便利です。\n\n### easing\n\n（デフォルト `easeInOutCubic`）縦および横のスクロールに使用するトランジション効果を定義します。  \n一部の[トランジション](https://api.jqueryui.com/easings/)を使用するには、`vendors/easings.min.js`ファイルまたは[jQuery UI](https://jqueryui.com/)が必要です。  \n他のライブラリを代わりに使用することもできます。\n\n### easingcss3\n\n（デフォルト `ease`）`css3:true`を使用する場合のトランジション効果を定義します。  \n`linear`、`ease-out`などの[事前定義されたもの](https://www.w3schools.com/cssref/css3_pr_transition-timing-function.asp)を使用するか、`cubic-bezier`関数を使用して独自のものを作成できます。  \n[Matthew Lein CSS Easing Animation Tool](https://matthewlein.com/ceaser/)を使用することをお勧めします。\n\n### loopTop\n\n（デフォルト `false`）最初のセクションで上にスクロールすると最後のセクションにスクロールするかどうかを定義します。\n\n### loopBottom\n\n（デフォルト `false`）最後のセクションで下にスクロールすると最初のセクションにスクロールするかどうかを定義します。\n\n### loopHorizontal\n\n（デフォルト `true`）横向きのスライダーが最後または最初のスライドに達した後にループするかどうかを定義します。\n\n### css3\n\n（デフォルト `true`）セクションおよびスライド内でスクロールするためにJavaScriptまたはCSS3トランスフォームを使用するかどうかを定義します。  \nタブレットやモバイルデバイスのブラウザでCSS3をサポートしている場合に動きを高速化するのに便利です。  \nこのオプションが`true`に設定されていてブラウザがCSS3をサポートしていない場合は、代替手段が使用されます。\n\n### autoScrolling\n\n（デフォルト `true`）\"自動\"スクロールを使用するか、\"通常\"のスクロールを使用するかを定義します。  \nまた、タブレットやモバイルデバイスでセクションがブラウザ/デバイスウィンドウにどのように適合するかにも影響します。\n\n### fitToSection\n\n（デフォルト `true`）セクションをビューポートに適合させるかどうかを決定します。  \n`true`に設定すると、現在のアクティブなセクションは常にビューポート全体を埋めます。  \nそれ以外の場合、ユーザーはセクションの途中で止めることができます。\n\n### fitToSectionDelay\n\n（デフォルト `1000`）`fitToSection`が`true`に設定されている場合、設定されたミリ秒だけフィットを遅らせます。\n\n### scrollBar\n\n（デフォルト `false`）サイトの**縦方向のセクション**にスクロールバーを使用するかどうかを決定します。  \nスクロールバーを使用する場合でも、`autoScrolling`機能は期待通りに動作します。 \nユーザーはスクロールバーを使用してサイトをスクロールでき、スクロールが終了するとfullPage.jsはセクションを画面にフィットさせます。\n\n### paddingTop\n\n（デフォルト `0`）各セクションのトップパディングを数値と単位で定義します。（例：paddingTop: '10px', paddingTop: '10em'）  \n固定ヘッダーを使用する場合に便利です。\n\n### paddingBottom\n\n（デフォルト `0`）各セクションのボトムパディングを数値と単位で定義します。（例：paddingBottom: '10px', paddingBottom: '10em'）  \n固定フッターを使用する場合に便利です。\n\n### fixedElements\n\n（デフォルト `null`）プラグインのスクロール構造から除外する要素を定義します。  \n`css3`オプションを使用している場合に、これらの要素を固定する必要があります。  \nこれにはJavaScriptセレクターの文字列が必要です。（例：`fixedElements: '#element1, .element2'`）\n\n### normalScrollElements\n\n（デフォルト `null`）[デモ](https://codepen.io/alvarotrigo/pen/RmVazM) 一部の要素上で自動スクロールを避けたい場合に使用するオプションです。（マップ、スクロール可能なdivなどに便利）  \nこれにはJavaScriptセレクターの文字列が必要です。（例：`normalScrollElements: '#element1, .element2'`）  \nこのオプションはセクション/スライド要素自体に適用すべきではありません。\n\n### bigSectionsDestination\n\n（デフォルト `null`）[デモ](https://codepen.io/alvarotrigo/pen/vYLdMrx) `scrollOverflow:true`を使用していない場合、ビューポートよりも高さが大きいセクションにスクロールする方法を定義します。（[小さなセクションや大きなセクションの作成方法](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#小さなセクションや大きなセクションの作成)を参照）  \nデフォルトでは、目的のセクションが上から来る場合は上部にスクロールし、下から来る場合は下部にスクロールします。  \n可能な値は`top`、`bottom`、`null`です。\n\n### adjustOnNavChange\n（デフォルト `true`）\nモバイルのナビゲーションバーやアドレスバーのサイズが変更されたり、表示/非表示が切り替わったときに、fullPage.jsがセクションの高さを調整するかどうかを定義します。`false` に設定すると、ナビゲーションバーが縮小または非表示になった際にセクションが全高で表示されなくなります。\n\n### keyboardScrolling\n\n（デフォルト `true`）キーボードを使用してコンテンツをナビゲートできるかどうかを定義します。\n\n### touchSensitivity\n\n（デフォルト `5`）ブラウザのウィンドウ幅/高さのパーセンテージを定義し、次のセクション/スライドに移動するためにスワイプがどの程度必要かを定義します。\n\n### skipIntermediateItems\n(デフォルト `false`)。非連続の垂直セクションまたは水平スライド間をナビゲートする際にスクロールアニメーションをスキップするかどうかを決定します。可能な値は `true`、`false`、`sections`、`slides` で、この動作を垂直方向、水平方向、または両方向に適用できます。\n\n### continuousVertical\n\n（デフォルト `false`）最後のセクションで下にスクロールすると最初のセクションにスクロールし、最初のセクションで上にスクロールすると最後のセクションにスクロールするかどうかを定義します。  \n`loopTop`、`loopBottom`またはサイト内のスクロールバー（`scrollBar:true`または`autoScrolling:false`）と互換性はありません。\n\n### continuousHorizontal\n\n（デフォルト `false`）[fullpage.jsの拡張機能](https://alvarotrigo.com/fullPage/extensions/)を参照してください。  \n最後のスライドを右にスライドすると最初のスライドにスライドし、最初のスライドを左にスライドすると最後のスライドにスライドするかどうかを定義します。  `loopHorizontal`とは互換性がありません。fullpage.js >= 3.0.1が必要です。\n\n### scrollHorizontally\n\n（デフォルト `false`）[fullpage.jsの拡張機能](https://alvarotrigo.com/fullPage/extensions/)を参照してください。  \nマウスホイールやトラックパッドを使用してスライダー内を水平にスライドするかどうかを定義します。  \n`autoScrolling:true`を使用する場合にのみ使用できます。  \nストーリーテリングデザインに最適です。fullpage.js >= 3.0.1が必要です。\n\n### interlockedSlides\n\n（デフォルト `false`）[fullpage.jsの拡張機能](https://alvarotrigo.com/fullPage/extensions/)を参照してください。  \n1つの水平スライダーを移動すると、他のセクション内のスライダーが同じ方向にスライドするかどうかを決定します。  \n値は`true`、`false`、または相互ロックされたセクションの配列です。例：`[1,3,5]`（1から始まります）  \nfullpage.js >= 3.0.1が必要です。\n\n### dragAndMove\n\n（デフォルト `false`）[fullpage.jsの拡張機能](https://alvarotrigo.com/fullPage/extensions/)を参照してください。  \nマウスや指を使用してセクションやスライドをドラッグおよびフリックする機能を有効または無効にします。  \nfullpage.js >= 3.0.1が必要です。  \n\n可能な値は次のとおりです。\n\n  - `true`：機能を有効にします。\n  - `false`：機能を無効にします。\n  - `vertical`：垂直方向にのみ機能を有効にします。\n  - `horizontal`：水平方向にのみ機能を有効にします。\n  - `fingersonly`：タッチデバイスのみで機能を有効にします。\n  - `mouseonly`：デスクトップデバイス（マウスとトラックパッド）でのみ機能を有効にします。\n\n### offsetSections\n\n（デフォルト `false`）[fullpage.jsの拡張機能](https://alvarotrigo.com/fullPage/extensions/)を参照してください。  \nパーセンテージに基づいてフルスクリーンでないセクションを使用する方法を提供します。  \n次のセクションや前のセクションの一部を表示することで、訪問者に対してサイトに他のコンテンツがあることを示すのに理想的です。  \nfullPage.js >= 3.0.1が必要です。\n各セクションのパーセンテージを定義するには、`data-percentage`属性を使用する必要があります。  \nビューポート内のセクションの中央揃えは、`data-centered`属性でブール値を使用して決定できます。（指定されていない場合はデフォルトで`true`になります）\n\n例：\n\n``` html\n<div class=\"section\" data-percentage=\"80\" data-centered=\"true\">\n```\n\n### resetSliders\n\n（デフォルト `false`）[fullpage.jsの拡張機能](https://alvarotrigo.com/fullPage/extensions/)を参照してください。  \nセクションを離れた後、各スライダーをリセットするかどうかを定義します。  \nfullpage.js >= 3.0.1が必要です。\n\n### fadingEffect\n\n（デフォルト `false`）[fullpage.jsの拡張機能](https://alvarotrigo.com/fullPage/extensions/)を参照してください。  \nデフォルトのスクロール効果の代わりにフェード効果を使用するかどうかを定義します。  \n指定可能な値は`true`、`false`、`sections`、`slides`です。  \n縦方向または横方向にのみ適用することも、両方に同時に適用することもできます。  \n`autoScrolling:true`を使用する場合にのみ使用できます。  \nfullpage.js >= 3.0.1が必要です。\n\n### animateAnchor\n\n（デフォルト `true`）サイトの読み込み時にアンカー（#）が与えられると、アニメーションで目的地にスクロールするか、直接指定されたセクションに読み込むかを定義します。\n\n### recordHistory\n\n（デフォルト `true`）URLのハッシュ(アンカーリンクなど)変更ごとにサイトのURL履歴にプッシュするかどうかを定義します。\n\n```javascript\nfullpage_api.setRecordHistory(false);\n```\n\n### menu\n\n（デフォルト `false`）セレクターを使用して、セクションとリンクさせるメニューを指定できます。  \nこの方法でセクションのスクロールに応じて、メニュー内の対応する要素に`active`クラスが追加されます。  \nこの機能はメニューを生成するのではなく、指定されたメニュー内の対応するアンカーリンクを持つ要素に`active`クラスをただ追加するだけです。  \nメニューの要素をセクションとリンクさせるには、セクション内で使用するのと同じアンカーリンクを使用してHTML5のデータ属性 (`data-menuanchor`) が必要です。\n\n例：\n\n```html\n<ul id=\"myMenu\">\n\t<li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">First section</a></li>\n\t<li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second section</a></li>\n\t<li data-menuanchor=\"thirdPage\"><a href=\"#thirdPage\">Third section</a></li>\n\t<li data-menuanchor=\"fourthPage\"><a href=\"#fourthPage\">Fourth section</a></li>\n</ul>\n```\n```javascript\nnew fullpage('#fullpage', {\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\n\tmenu: '#myMenu'\n});\n```\n\n**Note:** メニュー要素は、`css3:true`を使用する際の問題を避けるために、fullpageラッパーの外側に配置する必要があります。そうしないと、プラグインによって `body`に自動的に追加されます。\n\n### navigation\n\n(デフォルト `false`) `true`に設定すると、小さな円で構成されたナビゲーションバー(バレットナビゲーション)が表示されます。\n\n### navigationPosition\n\n(デフォルト `none`) ナビゲーションバーの位置を定義します。  \n`left`または`right`に設定することができます（ナビゲーションバーを使用する場合）\n\n### navigationTooltips\n\n（デフォルト []）ナビゲーションバーを使用する場合に表示するツールチップを定義します。  \n\n例：`navigationTooltips: ['firstSlide', 'secondSlide']`。\n\nまた、各セクションで`data-tooltip`属性を使用して定義することもできます。\n\n### showActiveTooltip\n\n(デフォルト `false`) 縦のナビゲーションでアクティブに表示されているセクションに対して、持続的にツールチップを表示します。\n\n### slidesNavigation\n\n(デフォルト `false`) `true`に設定すると、各横向きスライダーに対して小さな円で構成されたナビゲーションバー(バレットナビゲーション)が表示されます。\n\n### slidesNavPosition\n\n(デフォルト `bottom`) スライダー用の横向きナビゲーションバーの位置を定義します。  \n値として`top` と`bottom`を指定できます。  \nまた、CSSスタイルを変更して、上端または下端からの距離や色などのスタイルを調整することもできます。\n\n### scrollOverflow\n\n(デフォルト `true`) セクションやスライドのコンテンツがその高さを超える場合にスクロールを作成するかどうかを定義します。  \nこのオプションには`scrollBar: false`が必要です。  \n特定のセクションやスライドでfullpage.jsがスクロールバーを作成しないようにするには、クラス`fp-noscroll`を使用します。\n\n例えば: `<div class=\"section fp-noscroll\">`\n\nまた、セクション要素に `fp-auto-height-responsive`を使用することで、レスポンシブモードで`scrolloverflow`が適用されるのを防ぐこともできます。\n\n### scrollOverflowReset\n\n(デフォルト `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/).  \n可能な値は`true`、`false`、`sections`、`slides`です。  \n`true`に設定すると、別のセクションやスライドに移動する際に、セクションやスライドのコンテンツがスクロールバーで上にスクロールされます。  \nこれにより、下のセクションからスクロールしても、セクションやスライドは常にコンテンツの先頭を表示します。  \nセクションやスライドにクラス`fp-no-scrollOverflowReset`を追加すると、その特定のパネルに対してこの機能が無効になります。\n\n### scrollOverflowMacStyle\n\n(デフォルト `false`) 有効にすると、デフォルトのスクロールバーの代わりに「Macスタイル」のスクロールバーを使用します。Windowsではかなり異なって見えます。\n\n### sectionSelector\n\n(デフォルト `.section`) セクションに使用されるJavaScriptセレクターを変更できます。  \nfullpage.jsと同じセレクターを使用する他のプラグインとの問題を避けるために、必要に応じて変更する必要があります。\n\n### slideSelector\n\n(デフォルト `.slide`) スライドに使用されるJavaScriptセレクターを変更できます。  \nfullpage.jsと同じセレクターを使用する他のプラグインとの問題を避けるために、必要に応じて変更する必要があります。\n\n### responsiveWidth\n\n(デフォルト `0`) 定義されたピクセル幅以下の場合、通常のスクロール（`autoScrolling:false`）が使用されます。  \nユーザーが独自のレスポンシブCSSに使用したい場合、`fp-responsive`クラスがbodyタグに追加されます。  \n例えば、900に設定すると、ブラウザの幅が900未満の場合、fullpage.jsは通常のサイトのようにスクロールを表示します。\n\n### responsiveHeight\n\n(デフォルト `0`) 定義されたピクセル高さ以下の場合、通常のスクロール（`autoScrolling:false`）が使用されます。  \nユーザーが独自のレスポンシブCSSに使用したい場合、`fp-responsive`クラスがbodyタグに追加されます。  \n例えば、900に設定すると、ブラウザの高さが900未満の場合、プラグインは通常のサイトのようにスクロールします。\n\n### responsiveSlides\n\n(デフォルト `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/) `true`に設定すると、レスポンシブモードが有効になったとき（上記の `responsiveWidth`または`responsiveHeight`オプションを使用）、スライドが縦方向のセクションに変わります。  \nfullpage.js >= 3.0.1が必要です。\n\n### cinematic\n\n（デフォルト：`false`）[fullPage.js の拡張機能](https://alvarotrigo.com/fullPage/extensions/cinematic.html)。セクションでのスライダーエフェクトを有効または無効にします。fullpage.js >= 4.0.41 が必要です。\n\n### cinematicOptions\n\n（デフォルト：`{Object}`）`cinematic:true` オプションを使用する際のコンテンツアニメーションのパラメータを設定できます。[詳細はこちら](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cinematic-Effects#cinematicoptions)。\n\n### effects\n（デフォルト：`false`）[fullpage.jsの拡張機能](https://alvarotrigo.com/fullPage/extensions/slider-effects.html)。セクションにスライダー効果を有効または無効にします。fullpage.js >= 4.0.35 が必要です。\n\n### effectsOptions\n（デフォルト：`{Object}`、[\"focus\" プリセット](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#20-available-presetss)の設定）。  \n`effects:true` オプションを使うときに、効果のパラメータを設定できます。  \n[effects オプションの適用方法について詳しくはこちら](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#effects-options-documentation)\n\n### parallax\n\n(デフォルト `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). セクションやスライドにパララックス背景効果を使用するかどうかを指定します。 [パララックスオプションの適用方法について詳しく読む](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax)\n\n### parallaxOptions\n\n(デフォルト `{ type: 'reveal', percentage: 62, property: 'translate'}`) オプション`parallax:true` を使用する場合、パララックス背景効果のパラメーターを設定できます。 [パララックスオプションの適用方法について詳しく読む](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax)\n\n### dropEffect\n\n(デフォルト `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/) セクションやスライドにドロップ効果を使用するかどうかを指定します。 [ドロップ効果オプションの適用方法について詳しく読む](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect)\n\n### dropEffectOptions\n\n(デフォルト `{ speed: 2300, color: '#F82F4D', zIndex: 9999}`) オプション`dropEffect: true`を使用する場合、ドロップ効果のパラメーターを設定できます。[ドロップ効果オプションの適用方法について詳しく読む](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect)\n\n### waterEffect\n\n(デフォルト `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/) セクションやスライドにウォーター効果を使用するかどうかを定義します。[ウォーター効果オプションの適用方法について詳しく読む](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect)\n\n### waterEffectOptions\n\n(デフォルト `{ animateContent: true, animateOnMouseMove: true}`) オプション`waterEffect: true`を使用する場合、ウォーター効果のパラメーターを設定できます。[ウォーター効果オプションの適用方法について詳しく読む](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect)\n\n### cards\n\n(デフォルト `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/) セクションやスライドにカード効果を使用するかどうかを指定します。 [カード効果オプションの適用方法について詳しく読む](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards)\n\n### lazyLoading\n\n(デフォルト `true`) 遅延読み込みはデフォルトで有効になっており、`data-src`属性を含むすべてのメディア要素が遅延読み込みされます。  \n詳細は遅延読み込みドキュメントをご覧ください。 [遅延読み込み](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#遅延読み込み)  \n他の遅延読み込みライブラリを使用したい場合は、このfullpage.js機能を無効にすることができます。\n\n### lazyLoadThreshold\n（デフォルト `0`）現在のセクションに対して、隣接する垂直セクションと水平スライドのメディア要素を遅延読み込みする数を指定します。前後のセクションやスライドを何個プリロードするかを数値で指定してください。\n\n### cardsOptions\n\n(デフォルト: `{ perspective: 100, fadeContent: true, fadeBackground: true}`) オプション`cards: true`を使用する場合、カード効果のパラメーターを設定できます。[カードオプションの適用方法について詳しく読む](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards)\n\n### observer\n\n(デフォルト `true`) ページのHTML構造の変更を監視するかどうかを指定します。  \n有効にすると、fullPage.jsは変更に自動的に反応し、適宜更新します。  \nセクションやスライドの追加、削除、非表示にする場合に最適です。\n\n### credits\n\n(デフォルト `{enabled: true, label: 'Made with fullpage.js', position: 'right'}`) fullPage.jsのクレジット表記をするかどうかを指定します。  \nGPLv3ライセンスの条項0、4、5、および7に従い、GPLv3の下でfullPage.jsを使用する場合は、fullPage.jsが使用されていることを目立つ形で表記する必要があります。  \nこのオプションを有効にして、アトリビューション（帰属表示）を含めることをお勧めします。 **注意:** このオプションには、有効な `licenseKey` 値が必要です。\n\n## Methods\n各種提供しているメソッドについて説明します。 [メソッドについて](https://alvarotrigo.com/fullPage/examples/methods.html)\n\n### getActiveSection()\n[デモ](https://codepen.io/alvarotrigo/pen/VdpzRN/) アクティブなセクションのオブジェクトを取得します。(type [Section](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#コールバック)) \n\n```javascript\nfullpage_api.getActiveSection();\n```\n\n### getActiveSlide()\n[デモ](https://codepen.io/alvarotrigo/pen/VdpzRN/) アクティブなスライドのオブジェクトを取得します。(type [Slide](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#コールバック))\n\n```javascript\nfullpage_api.getActiveSlide();\n```\n\n### getScrollY() & getScrollX\n[デモ](https://codepen.io/alvarotrigo/pen/GRyGqro) `getScrollY`はfullPageラッパーのy座標を取得します。  \n`getScrollX`はアクティブな横方向スライドのx座標を取得します。\n\n```javascript\nfullpage_api.getScrollY();\nfullpage_api.getScrollX();\n```\n\n### moveSectionUp()\n[デモ](https://codepen.io/alvarotrigo/pen/GJXNMN) 一つ上のセクションにスクロールします。\n```javascript\nfullpage_api.moveSectionUp();\n```\n---\n### moveSectionDown()\n[デモ](https://codepen.io/alvarotrigo/pen/jPvVZx) 一つ下のセクションにスクロールします。\n```javascript\nfullpage_api.moveSectionDown();\n```\n---\n### moveTo(section, slide)\n[デモ](https://codepen.io/alvarotrigo/pen/doqOmY) 指定されたセクションとスライドにスクロールします。  \n最初のセクションはインデックス1から始まります。  \n最初のスライド（デフォルトで表示されるスライド）はインデックス0から始まります。\n```javascript\n/* アンカーリンク firstSlide のセクションにスクロールし、2番目のスライドに移動します。*/\nfullpage_api.moveTo('firstSlide', 2);\n\n```\n\n```javascript\n//サイト内の3番目のセクション（インデックス3）にスクロールします。\nfullpage_api.moveTo(3, 0);\n\n//下記のように指定も可能です。\nfullpage_api.moveTo(3);\n```\n---\n### silentMoveTo(section, slide)\n[デモ](https://codepen.io/alvarotrigo/pen/doqOeY) 機能としては[`moveTo`](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese#movetosection-slide) と同じですが、アニメーションなしでスクロールを実行します。目的地への直接ジャンプです。\n```javascript\n/* アンカーリンク firstSlide のセクションにスクロールし、2番目のスライドに移動します。 */\nfullpage_api.silentMoveTo('firstSlide', 2);\n```\n---\n### moveSlideRight()\n[デモ](https://codepen.io/alvarotrigo/pen/Wvgoyz)  現在のセクションの横方向スライダーを次のスライドにスクロールします。\n```javascript\nfullpage_api.moveSlideRight();\n```\n---\n### moveSlideLeft()\n[デモ](https://codepen.io/alvarotrigo/pen/gpdLjW)  現在のセクションの横方向スライダーを前のスライドにスクロールします。\n```javascript\nfullpage_api.moveSlideLeft();\n```\n---\n### setAutoScrolling(boolean)\n[デモ](https://codepen.io/alvarotrigo/pen/rVZWrR) スクロール設定をリアルタイムで設定します。  \nページのスクロールの動作を定義します。  \n`true`に設定すると、「自動」スクロールを使用し、それ以外の場合はサイトの「手動」または「通常」スクロールを使用します\n\n```javascript\nfullpage_api.setAutoScrolling(false);\n```\n---\n### setFitToSection(boolean)\n[デモ](https://codepen.io/alvarotrigo/pen/GJXNYm) オプション `fitToSection`の値を変更し、セクションを画面にフィットさせるかどうかを決定します。\n\n```javascript\nfullpage_api.setFitToSection(false);\n```\n---\n### fitToSection()\n[デモ](https://codepen.io/alvarotrigo/pen/JWWagj) 画面表示上、最も近いアクティブなセクションにスクロールし、それをビューポートにフィットさせます。\n\n```javascript\nfullpage_api.fitToSection();\n```\n---\n### setLockAnchors(boolean)\n[デモ](https://codepen.io/alvarotrigo/pen/yNxVRQ) オプション`lockAnchors`の値を変更し、アンカーがURLに影響を与えるかどうかを決定します。\n\n```javascript\nfullpage_api.setLockAnchors(false);\n```\n---\n### setAllowScrolling(boolean, [directions])\n[デモ](https://codepen.io/alvarotrigo/pen/EjeNdq) マウスホイール/トラックパッドやタッチジェスチャーを使用してセクション/スライドをスクロールする機能を追加または削除します（デフォルトでは有効）。  \nなお、このメソッドではキーボードスクロールは無効になりません。キーボードの設定には`setKeyboardScrolling`を使用する必要があります。\n\n- `directions`: (任意の引数です) 許容される値: `all`, `up`, `down`, `left`, `right` または、`down, right`のようにコンマで区切った組み合わせ。スクロールを有効または無効にする方向を定義します。\n\n```javascript\n\n//スクロールを無効化\nfullpage_api.setAllowScrolling(false);\n\n//下スクロールを無効化\nfullpage_api.setAllowScrolling(false, 'down');\n\n//下方向・右方向スクロールを無効化\nfullpage_api.setAllowScrolling(false, 'down, right');\n```\n---\n### setKeyboardScrolling(boolean, [directions])\n[デモ](https://codepen.io/alvarotrigo/pen/GJXNwm) キーボードを使用してセクションをスクロールする機能を追加または削除します。（デフォルトで有効）\n\n- `directions`: (任意の引数です) 許容される値: `all`, `up`, `down`, `left`, `right` または、`down, right`のようにコンマで区切った組み合わせ。スクロールを有効または無効にする方向を定義します。\n\n```javascript\n//スクロールを無効化\nfullpage_api.setKeyboardScrolling(false);\n\n//下スクロールを無効化\nfullpage_api.setKeyboardScrolling(false, 'down');\n\n//下方向・右方向スクロールを無効化\nfullpage_api.setKeyboardScrolling(false, 'down, right');\n```\n---\n### setRecordHistory(boolean)\n[デモ](https://codepen.io/alvarotrigo/pen/rVZWQb) 各URL変更の履歴をブラウザのURL履歴にプッシュするかどうかを定義します。\n\n```javascript\nfullpage_api.setRecordHistory(false);\n```\n---\n### setScrollingSpeed(milliseconds)\n[デモ](https://codepen.io/alvarotrigo/pen/NqLbeY) スクロール速度をミリ秒単位で定義します。\n\n```javascript\nfullpage_api.setScrollingSpeed(700);\n```\n---\n### destroy(type)\n[デモ](https://codepen.io/alvarotrigo/pen/bdxBzv) fullpage.jsのイベントを削除します。  \nまた、オプションでHTMLマークアップとスタイルを削除できます。  \nAJAXを使用してコンテンツを読み込む際に有用です。\n\n- `type`：（オプションのパラメータ）空または`all`に指定できます。`all`が指定されると、fullpage.jsが使用したHTMLマークアップとスタイルが削除されます。これにより、fullpage.jsによる変更前の元のHTMLマークアップに戻ります。\n\n```javascript\n//fullPage.jsが作成したすべてのJavaScriptイベント（スクロール、URLのハッシュ変更など）を破壊\nfullpage_api.destroy();\n\n//すべてのJavaScriptイベントと、fullPage.jsが元のHTMLマークアップに対して行った変更を破壊\nfullpage_api.destroy('all');\n```\n---\n### reBuild()\nDOM構造を更新して新しいウィンドウサイズまたはそのコンテンツに適合させます。  \nAJAX呼び出しやサイトのDOM構造の外部変更と組み合わせて使用するのに適しています。  \n特に`scrollOverflow:true`を使用している場合などです。\n\n```javascript\nfullpage_api.reBuild();\n```\n---\n### setResponsive(boolean)\n[デモ](https://codepen.io/alvarotrigo/pen/WxOyLA) ページのレスポンシブモードを設定します。  \n`true`に設定すると、autoScrollingがオフになり、`responsiveWidth`または`responsiveHeight`オプションが発動したときと同じ結果になります。\n```javascript\nfullpage_api.setResponsive(true);\n```\n---\n### responsiveSlides.toSections()\n[fullpage.jsの拡張機能](https://alvarotrigo.com/fullPage/extensions/)。fullpage.js >= 3.0.1が必要です。\n水平スライドを垂直セクションに変換します。\n\n```javascript\nfullpage_api.responsiveSlides.toSections();\n```\n---\n### responsiveSlides.toSlides()\n[fullpage.jsの拡張機能](https://alvarotrigo.com/fullPage/extensions/)。fullpage.js >= 3.0.1が必要です。\nスライド（垂直セクションに変換されたスライド）を再び水平スライドに戻します。\n\n```javascript\nfullpage_api.responsiveSlides.toSlides();\n```\n\n## コールバック(Callbacks)\n[デモ](https://codepen.io/alvarotrigo/pen/XbPNQv) こちらで動作を確認できます：[コールバックの例](https://alvarotrigo.com/fullPage/examples/callbacks.html)\n\n一部のコールバック（例：`onLeave`）には、次のプロパティを含むオブジェクト型のパラメータが引数として渡されます。\n\n- `anchor`：*(String)* アイテムのアンカー。\n- `index`：*(Number)* アイテムのインデックス。\n- `item`：*(DOM element)* アイテム要素。\n- `isFirst`：*(Boolean)* アイテムが最初の子かどうかを決定します。\n- `isLast`：*(Boolean)* アイテムが最後の子かどうかを決定します。\n\n### afterLoad (`origin`, `destination`, `direction`, `trigger`)\n[デモ](https://codepen.io/alvarotrigo/pen/XbPNQv) セクションが読み込まれ、スクロールが終了した後に発火するコールバック。  \nパラメータ：\n\n- `origin`：*(Object)* 移動元(イベント発火元)のセクション。\n- `destination`：*(Object)* 移動先(イベント発火後)のセクション。\n- `direction`：*(String)* スクロール方向に応じて`up`または`down`の値を取ります。\n- `trigger`：*(String)* スクロールをトリガーしたアクションを示します。可能な値は：\"wheel\"、\"keydown\"、\"menu\"、\"slideArrow\"、\"verticalNav\"、\"horizontalNav\"です。\n\n例：\n\n```javascript\nnew fullpage('#fullpage', {\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\n\n\tafterLoad: function(origin, destination, direction, trigger){\n\t\tvar origin = this;\n\n\t\t//インデックスを使用\n\t\tif(origin.index == 2){\n\t\t\talert(\"セクション3の読み込みが終了しました\");\n\t\t}\n\n\t\t//アンカーリンクを使用\n\t\tif(origin.anchor == 'secondSlide'){\n\t\t\talert(\"セクション2の読み込みが終了しました\");\n\t\t}\n\t}\n});\n```\n\n---\n### onLeave (`origin`, `destination`, `direction`, `trigger`)\n[デモ](https://codepen.io/alvarotrigo/pen/XbPNQv) ユーザーがセクションを離れて新しいセクションに移動するときに発生するコールバック。  \n戻り値が`false`の場合、移動はキャンセルされます。\n\nパラメータ：\n\n- `origin`：*(Object)* 移動元(イベント発火元)のセクション。\n- `destination`：*(Object)* 移動先(イベント発火後)のセクション。\n- `direction`：*(String)* スクロール方向に応じて`up`または`down`の値を取ります。\n- `trigger`：*(String)* スクロールをトリガーしたものを示します。可能な値は：\"wheel\"、\"keydown\"、\"menu\"、\"slideArrow\"、\"verticalNav\"、\"horizontalNav\"です。\n\n例：\n\n```javascript\nnew fullpage('#fullpage', {\n\tonLeave: function(origin, destination, direction, trigger){\n\t\tvar leavingSection = this;\n\n\t\t//セクション2を離れた後\n\t\tif(origin.index == 1 && direction =='down'){\n\t\t\talert(\"セクション3に移動します！\");\n\t\t}\n\n\t\telse if(origin.index == 1 && direction == 'up'){\n\t\t\talert(\"セクション1に移動します！\");\n\t\t}\n\t}\n});\n```\n\n\n---\n### beforeLeave (`origin`, `destination`, `direction`, `trigger`)\n[デモ](https://codepen.io/alvarotrigo/pen/XbPNQv) セクションを離れる直前、トランジションが行われる前に発生するコールバック。\n\nスクロールが発生する前にキャンセルするには、このコールバックを使用して`false`を返すことで実現できます。\n\nパラメータ：\n\n- `origin`：*(Object)* 移動元(イベント発火元)のセクション。\n- `destination`：*(Object)* 移動先(イベント発火後)のセクション。\n- `direction`：*(String)* スクロール方向に応じて`up`または`down`の値を取ります。\n- `trigger`：*(String)* スクロールをトリガーしたものを示します。可能な値は：\"wheel\"、\"keydown\"、\"menu\"、\"slideArrow\"、\"verticalNav\"、\"horizontalNav\"です。\n\n例：\n\n```javascript\n\nvar cont = 0;\nnew fullpage('#fullpage', {\n\tbeforeLeave: function(origin, destination, direction, trigger){\n\n\t\t// 4回スクロールするまでスクロールを防ぎます\n\t\tcont++;\n\t\treturn cont === 4;\n\t}\n});\n```\n\n---\n### afterRender()\n[デモ](https://codepen.io/alvarotrigo/pen/XbPNQv) ページのDOM構造が生成された直後に発火するコールバック。  \nこのコールバックは、他のプラグインの初期化、DOM構造を必要とするコードを実行するために使用します（このプラグインは結果として構造を作成するためにDOMを変更します）。  \n詳細は[FAQ](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions)を参照してください。\n\n例：\n\n```javascript\nnew fullpage('#fullpage', {\n\tafterRender: function(){\n\t\tvar pluginContainer = this;\n\t\talert(\"DOM構造が生成されました);\n\t}\n});\n```\n---\n### afterResize(`width`, `height`)\n[デモ](https://codepen.io/alvarotrigo/pen/XbPNQv) ブラウザのウィンドウサイズが変更された後、セクションがリサイズされた直後に発火するコールバック。\n\nパラメータ：\n\n- `width`：*(Number)* ウィンドウの幅。\n- `height`：*(Number)* ウィンドウの高さ。\n\n例：\n\n```javascript\nnew fullpage('#fullpage', {\n\tafterResize: function(width, height){\n\t\tvar fullpageContainer = this;\n\t\talert(\"セクションのリサイズが完了しました\");\n\t}\n});\n```\n---\n### afterReBuild()\n[デモ](https://codepen.io/alvarotrigo/pen/XbPNQv) `fullpage_api.reBuild()`を呼び出してfullpage.jsを手動で再構築した後に発火するコールバック。\n\n例：\n\n```javascript\nnew fullpage('#fullpage', {\n\tafterReBuild: function(){\n\t\tconsole.log(\"fullPage.js が手動で再構築されました\");\n\t}\n});\n```\n---\n### afterResponsive(`isResponsive`)\n[デモ](https://codepen.io/alvarotrigo/pen/XbPNQv) fullpage.jsが通常モードからレスポンシブモードに切り替わった後、またはレスポンシブモードから通常モードに戻った後に発火するコールバック。\n\nパラメータ：\n\n- `isResponsive`：*(Boolean)* レスポンシブモードに入る場合は`true`、通常モードに戻る場合は`false`を示します。\n\n例：\n\n```javascript\nnew fullpage('#fullpage', {\n\tafterResponsive: function(isResponsive){\n\t\talert(\"レスポンシブモードか？: \" + isResponsive);\n\t}\n});\n```\n---\n### afterSlideLoad (`section`, `origin`, `destination`, `direction`, `trigger`)\n[デモ](https://codepen.io/alvarotrigo/pen/XbPNQv) セクションのスライドが読み込まれ、スクロールが終了した後に発火するコールバック。\n\nパラメータ：\n\n- `section`：*(Object)* アクティブな縦方向のセクション。\n- `origin`：*(Object)* 移動元の水平スライド。\n- `destination`：*(Object)* 移動後の水平スライド。\n- `direction`：*(String)* スクロール方向に応じて`right`または`left`の値を取ります。\n- `trigger`：*(String)* スクロールをトリガーしたアクションを示します。可能な値は：\"wheel\"、\"keydown\"、\"menu\"、\"slideArrow\"、\"verticalNav\"、\"horizontalNav\"です。\n\n例：\n\n```javascript\nnew fullpage('#fullpage', {\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\n\n\tafterSlideLoad: function( section, origin, destination, direction, trigger){\n\t\tvar loadedSlide = this;\n\n\t\t//セクション2の最初のスライド\n\t\tif(section.anchor == 'secondPage' && destination.index == 1){\n\t\t\talert(\"最初のスライドが読み込まれました\");\n\t\t}\n\n\t\t//セクション2の2番目のスライド（#secondSlideが2番目のスライドのアンカーであると仮定します）\n\t\tif(section.index == 1 && destination.anchor == 'secondSlide'){\n\t\t\talert(\"2番目のスライドが読み込まれました\");\n\t\t}\n\t}\n});\n```\n\n\n---\n### onSlideLeave (`section`, `origin`, `destination`, `direction`, `trigger`)\n[デモ](https://codepen.io/alvarotrigo/pen/XbPNQv) ユーザーがスライドを離れて別のスライドに移動する際に発生するコールバック。  \n戻り値が`false`の場合、移動はキャンセルされます。\n\nパラメータ：\n\n- `section`：*(Object)* アクティブな縦方向のセクション。\n- `origin`：*(Object)* 移動元の水平スライド。\n- `destination`：*(Object)* 移動後の水平スライド。\n- `direction`：*(String)* スクロール方向に応じて`right`または`left`の値を取ります。\n- `trigger`：*(String)* スクロールをトリガーしたものを示します。可能な値は：\"wheel\"、\"keydown\"、\"menu\"、\"slideArrow\"、\"verticalNav\"、\"horizontalNav\"です。\n\n例：\n\n```javascript\nnew fullpage('#fullpage', {\n\tonSlideLeave: function( section, origin, destination, direction, trigger){\n\t\tvar leavingSlide = this;\n\n\t\t//セクション2の最初のスライドから右に移動する\n\t\tif(section.index == 1 && origin.index == 0 && direction == 'right'){\n\t\t\talert(\"最初のスライドを離れる!\");\n\t\t}\n\n\t\t//セクション2の3番目のスライドから左に移動する\n\t\tif(section.index == 1 && origin.index == 2 && direction == 'left'){\n\t\t\talert(\"スライド 2 に移動中!\");\n\t\t}\n\t}\n});\n```\n\n#### 移動が発生する前にキャンセルする\n`onSlideLeave`コールバックで`false`を返すことで移動をキャンセルできます。[`onLeave`](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese/#cancelling-the-scroll-before-it-takes-place)での移動をキャンセル場合と同様の挙動です。\n\n\n---\n### onScrollOverflow (`section`, `slide`, `position`, `direction`)\n[デモ](https://codepen.io/alvarotrigo/pen/XbPNQv) `scrollOverflow: true`オプションを使用している場合に、スクロール可能なセクション内でスクロールすると発火するコールバック。\n\nパラメータ：\n\n- `section`：*(Object)* アクティブな縦方向のセクション。\n- `slide`：*(Object)* 発火元の水平スライド。\n- `position`：*(Integer)* セクション/スライド内でのスクロール量。0から始まります。\n- `direction`：*(String)* `up`または`down`\n\n例：\n\n```javascript\nnew fullpage('#fullpage', {\n\tonScrollOverflow: function( section, slide, position, direction){\n\t\tconsole.log(section);\n\t\tconsole.log(\"位置: \" + position);\n\t}\n});\n```\n\n# 問題の報告\n1. 質問する前にGithubの全Issueを検索して確認してください。\n2. 最新のfullpage.jsバージョンを使用していることを確認してください。古いバージョンにはサポートが提供されません。\n3. [GitHub Issuesフォーラム](https://github.com/alvarotrigo/fullPage.js/issues)を使用して問題を作成します。\n4. **問題だけにフォーカスした再現が必要です。** 可能であれば[jsfiddle](https://jsfiddle.net/alvarotrigo/ea17skjr/)や[codepen](https://codepen.io/alvarotrigo/pen/qqabrp)を使用してください。\n\n# fullpage.jsへの貢献\n[fullpage.jsへの貢献](https://github.com/alvarotrigo/fullPage.js/wiki/Contributing-to-fullpage.js)をご覧ください。\n\n# 変更履歴\n最近の変更については、[リリースセクション](https://github.com/alvarotrigo/fullPage.js/releases)を参照してください。\n\n# ビルドタスク\nfullpage.jsの配布ファイルをビルドしたい場合は、[ビルドタスク](https://github.com/alvarotrigo/fullPage.js/wiki/Build-tasks)をご覧ください。\n\n# リソース\n- Gutenberg用[Wordpressプラグイン](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/)およびElementor用[Wordpressプラグイン](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/)。\n- [Wordpressテーマ](https://alvarotrigo.com/fullPage/utils/wordpress.html)\n- [公式Vue.jsラッパーコンポーネント](https://github.com/alvarotrigo/vue-fullpage.js)\n- [公式React.jsラッパーコンポーネント](https://github.com/alvarotrigo/react-fullpage)\n- [公式Angularラッパーコンポーネント](https://github.com/alvarotrigo/angular-fullpage)\n- [CSS Easing Animation Tool - Matthew Lein](https://matthewlein.com/ceaser/)（`easingcss3`値の定義に便利）\n- [fullPage.js jsDelivr CDN](https://www.jsdelivr.com/package/npm/fullpage.js)\n- [fullPage.jsプラグイン for October CMS](https://github.com/freestream/oc-parallax-plugin)\n- [fullPage.js Angular2ディレクティブ](https://github.com/meiblorn/ng2-fullpage)\n- [fullPage.js angularディレクティブ](https://github.com/hellsan631/angular-fullpage.js)\n- [fullPage.js ember-cliアドオン](https://www.npmjs.com/package/ember-cli-fullpagejs)\n- [fullPage.js Rails Ruby Gem](https://rubygems.org/gems/fullpagejs-rails)\n- [Angular fullPage.js - Angular.js v1.x用の適応](https://github.com/mmautomatizacion/angular-fullpage.js)\n- [fullPage.jsとWordpressの統合方法（チュートリアル）](https://premium.wpmudev.org/blog/build-apple-inspired-full-page-scrolling-pages-for-your-wordpress-site/)\n- [Divi用Wordpressプラグイン](https://alvarotrigo.com/fullPage/wordpress-plugin-divi/)\n- [Elementor用Wordpressプラグイン](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/)\n\n## fullPage.jsを使用しているサイト\n\n![fullPage.jsを使用しているサイト](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/using-fullpage.png)\n\n- http://www.bbc.co.uk/news/resources/idt-d88680d1-26f2-4863-be95-83298fd01e02\n- http://medoff.ua/en/\n- http://promo.prestigio.com/grace1/\n- http://torchbrowser.com/\n- http://www.boxreload.com/\n- http://boxx.hk/\n- http://www.villareginateodolinda.it\n\n## スポンサー\nスポンサーになって、GitHub の README にあなたのロゴを掲載し、サイトへのリンクを追加しましょう。[[お問い合わせ](https://alvarotrigo.com/#contact)] | [[Patreon になる]](https://www.patreon.com/fullpagejs) | [GitHub スポンサーになる](https://github.com/sponsors/alvarotrigo)\n\n\n[![Warp](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/warp.png)](http://go.warp.dev/fullPage)\n[![Crawlbase](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/crawlbase.png)](https://crawlbase.com/?utm_source=github&utm_medium=sponsor&utm_campaign=fullpagejs)\n[![TestMu](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/testmu-ai.png)](https://www.testmu.com/?utm_source=fullpagejs&utm_medium=sponsor)\n[![Codeless](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codeless.png)](https://codeless.co)\n[![Stackpath](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/stackpath3.png)](https://www.stackpath.com/)\n[![Browserstack](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/browserstack3.png)](http://www.browserstack.com/)\n[![CodePen](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codepen3.png)](https://codepen.com)\n\n### People\n<a href=\"https://github.com/donsalvadori\" target=\"_blank\" rel=\"nofollow\">\n\t<img src=\"http://wallpapers-for-ipad.com/fullpage/imgs3/avatars/donsalvadori.jpg\">\n</a>\n\n## 貢献してくださった方々\n\n<a href=\"https://github.com/alvarotrigo/fullPage.js/graphs/contributors\">\n  <img src=\"https://contrib.rocks/image?repo=alvarotrigo/fullPage.js&max=400&columns=25&anon=1&v=2\" />\n</a>\n"
  },
  {
    "path": "lang/japanese/how-to-activate-fullpage-extension.md",
    "content": "# fullPage.js エクステンション(拡張機能)の有効化方法\n\n1. [https://alvarotrigo.com/fullPage/extensions/activationKey.html](https://alvarotrigo.com/fullPage/extensions/activationKey.html) にアクセスします。（これは、エクステンション購入時にメールで送信されたURLです）\n2. 購入時に提供された**ライセンスキー**を入力します。これは購入確認メールにも記載されています。\n3. **アクティベーションキー**を取得するために、ドメイン名の入力が求められる場合があります。\n4. **アクティベーションキー**とドメイン（前述の手順で生成された）を取得したら、fullPage.jsの初期化時に `nameOfExtension + \"Key\": key` という形式でオプションを追加する必要があります。\n\n例えば：\n\n```javascript\nnew fullPage('#fullpage', {\n    fadingEffect: true,\n    fadingEffectKey: 'ここにアクティベーションキーを入力',\n});\n```\n\n他のエクステンションについても同様の手順です。現在のところ、以下のエクステンションオプションがあります。\n\n* `fadingEffectKey`\n* `responsiveSlidesKey`\n* `continuousHorizontalKey`\n* `interlockedSlidesKey`\n* `scrollHorizontallyKey`\n* `resetSlidersKey`\n* `offsetSectionsKey`\n* `dragAndMoveKey`\n* `parallaxKey`\n\nエクステンションを使用するには、[fullpage.extensions.min.js](https://github.com/alvarotrigo/fullPage.js/blob/master/dist/fullpage.extensions.min.js) を使用する必要があります。  \nこれは通常の fullPage.js (`fullpage.js`) とは異なります。[エクステンションの使用方法](https://github.com/alvarotrigo/fullPage.js#use-extensions)で説明されているようにしてください。\n\n### 開発環境やウェブサイトの場合は？\nlocalhost と 127.0.0.0.1 にはアクティベーションキーは必要ありません。他のステージングドメインにはライセンス（プロフェッショナルまたはビジネスライセンス）が必要で、新しいキーを生成することができます。\n\n複数のアクティベーションキーを生成できるライセンスをお持ちの場合、すべてのドメインで同じJSコードを使用できます。この場合、異なるドメインごとにキーの配列を使用できます。例えば、`scrollHorizontally` エクステンションを3つのドメインで使用する場合、次のように設定します：\n\n```js\nnew fullPage('#fullpage', {\n    scrollHorizontally: true,\n    scrollHorizontallyKey: ['domain1_key', 'domain2_key', 'domain3_key'],\n});\n```\n\nこのように設定することで、これら3つのドメインのいずれでもエクステンションを使用できます。\n\n### ライセンスキーとアクティベーションキーの違い\nこれらは異なるキーです。\n- **ライセンスキー**はエクステンション購入時に提供されます。\n- **アクティベーションキー**は特定のドメインに対してエクステンションを有効化する際に取得します（ビジネスライセンスを使用する場合を除く）。生成するには**ライセンスキー**が必要です。\n\nライセンスキーは4つの8文字のグループで構成されています。(`XXXXXXXXXXXX-XXXXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX`)  \nアクティベーションキーは可変長で、グループに分かれていません 。(`XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`)  \nこれらを混同しないようにしてください。\n"
  },
  {
    "path": "lang/japanese/parallax-extension.md",
    "content": "# Parallax Extension \n\n![](https://cloud.githubusercontent.com/assets/1706326/23580315/f28edab4-00f6-11e7-90f9-81ffafd77b0e.gif)\n\n[エクステンションの使用方法](https://github.com/alvarotrigo/fullPage.js#use-extensions)を確認してから、パララックスオプションを使用してください。\n- [ライブデモ](http://alvarotrigo.com/fullPage/extensions/parallax.html)\n- [必要なHTML構造](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax#required-html-structure)\n- [背景の適用方法](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax#applying-the-background)\n- [オプション](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax#options)\n  - [パララックスエフェクトオプション](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax#parallax-effect-options)\n- [メソッド](https://github.com/alvarotrigo/fullPage.js/wiki/Extension---Parallax#methods)\n\n## HTML\nセクションやスライド内でパララックスエフェクトを使用するには、`fp-bg` クラスを持つ新しい要素を追加する必要があります。これは、セクションやスライドの最初の子要素として配置された空の `div` である必要があります。次のようになります：\n\n```html\n<div class=\"fp-bg\"></div>\n```\n\nこの要素に対して背景を適用し、セクションやスライドそのものには適用しません。\n\n例えば：\n```html\n<div id=\"fullpage\">\n    <div class=\"section\" id=\"section1\">\n        <div class=\"fp-bg\"></div>\n        スライド 1.1\n    </div>\n    <div class=\"section\" id=\"section2\">\n        <div class=\"slide\" id=\"slide2-1\">\n            <div class=\"fp-bg\"></div>\n            スライド 2.1\n        </div>\n        <div class=\"slide\" id=\"slide2-2\">\n            <div class=\"fp-bg\"></div>\n            スライド 2.2\n        </div>\n    </div>\n</div>\n```\n\nこの構造は、[パララックスデモページ](http://alvarotrigo.com/fullPage/extensions/parallax.html)のソースコードで確認できます。\n\n> どうしてもレイアウトに新しい要素を追加したくない場合は、`parallaxOptions` 内の `property` オプションを `background` に設定して、現在のセクションやスライドの背景にエフェクトを適用できます。  \n> `fp-bg` 要素を使用する場合と比べてパフォーマンスが劣るため、本当に必要な場合にのみおすすめします。\n\n<br>\n\n## 背景の適用方法\n背景は、セクションやスライドに背景を適用するのと同じ方法で `fp-bg` 要素に適用します。CSSまたはインラインスタイリングを使用できます。\n\n例えば：\n```css\n#section1 .fp-bg{\n    background-image: url('imgs/alvaro-genious.jpg');\n    background-size: cover;\n    background-position: center 80%;\n}\n```\n\n## オプション\n\n| オプション  | 説明 |\n| ------------- | ------------- |\n| **parallax**  | (デフォルト `false`)。 [fullPage.jsのエクステンション](http://alvarotrigo.com/fullPage/extensions/)。セクション/スライドにパララックス背景エフェクトを使用するかどうかを定義します。可能な値は `false`、`true`、`sections`、`slides` です。 |\n| **parallaxOptions:**   | (デフォルト: `{ type: 'reveal', percentage: 62, property: 'translate'}`) 。`parallax:true` オプションを使用する際のパララックス背景エフェクトのパラメーターを設定します。 |\n\n<br>\n\n### パララックスエフェクトオプション\n[デモページ](http://alvarotrigo.com/fullPage/extensions/parallax.html)で動作を確認できます。\n\n`parallaxOptions` 内で設定可能なオプションの説明：\n\n| parallaxOptions  | 説明 |\n| ------------- | ------------- |\n| **type**  | (デフォルト `reveal`) 可能な値は `cover` と `reveal` です。現在のセクション/スライドが目的のセクション/スライドの上または下に配置されるかどうかを選択できます。`cover` を使用すると、次のセクションやスライドが現在のセクションやスライドの一部を覆う形で表示されます。`reveal` を使用すると、効果が反転し、目的のセクションやスライドの一部を覆いながら表示されます。 |\n| **percentage**  | (デフォルト 62) ビューポートに対するパララックス効果の割合を定義します。値が小さいほどパララックス効果は小さく、100（最大値）にすると完全に静的な背景が表示されます。 |\n| **property** | 可能な値は `translate` と `background` です。パララックス効果を `fp-bg` 要素に適用するか、セクションやスライドの背景プロパティに直接適用するかを定義します。このオプションのデフォルト値を使用することを推奨します。 |\n\n`fp-bg` 要素を使用することで、translate3d ハードウェアアクセラレーションを利用できるため、パフォーマンスが向上します。**property**オプションは、特定の理由で各セクションやスライドに追加の `fp-bg` 要素を追加したくない場合や、HTMLマークアップを変更できない場合のために用意されています。\n\n## メソッド\n[デモページ](http://alvarotrigo.com/fullPage/extensions/parallax.html)で動作を確認できます。\n\n### setOption(optionName, value)\n指定したオプションの値を設定します。`optionName` は `parallaxOptions` 内のいずれかのオプション（`type`、`percentage` または `property`）です。\n```javascript\n// `type` プロパティの値を変更する\nfullpage_api.parallax.setOption('type', 'cover');\n\n// `percentage` プロパティの値を変更する\nfullpage_api.parallax.setOption('percentage', '30');\n```\n---\n\n### init()\nパララックスエフェクトを有効にします。特定のタイミングで動的に有効にする必要がある場合に便利です。\n```javascript\nfullpage_api.parallax.init();\n```\n---\n### destroy()\nパララックスエフェクトをオフにします。\n```javascript\nfullpage_api.parallax.destroy();\n```\n"
  },
  {
    "path": "lang/korean/README.md",
    "content": "# fullPage.js\n![preview](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/intro.png)\n![compatibility](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/compatible.png)\n\n<p align=\"center\">\n  <a href=\"https://github.com/alvarotrigo/fullPage.js\">English</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish#fullpagejs\">Español</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#fullpagejs\">Français</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian#fullpagejs\">Pусский</a> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese#fullpagejs\">中文</a> |\n  <span>한국어</span> |\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese#fullpagejs\"> 日本語</a> | \n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese#fullpagejs\">Português Brasileiro</a>\n</p>\n\n<p align=\"center\">\n\t<a href=\"https://github.com/alvarotrigo/vue-fullpage.js\">Vue</a>, <a href=\"https://github.com/alvarotrigo/react-fullpage\">React</a>와 <a href=\"https://github.com/alvarotrigo/angular-fullpage\">Angular</a> 에서 사용 가능.\n</p>\n---\n\n![fullPage.js version](https://img.shields.io/badge/fullPage.js-v4.0.41-brightgreen.svg)\n[![License](https://img.shields.io/badge/License-GPL-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.html)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/fullpage.js/badge?style=rounded)](https://www.jsdelivr.com/package/npm/fullpage.js)\n[![Minzipped Size](https://img.shields.io/bundlephobia/minzip/fullpage.js)](https://bundlephobia.com/package/fullpage.js)\n&nbsp;&nbsp;**|**&nbsp;&nbsp; *Created by [@imac2](https://twitter.com/imac2)*\n\n- [실시간 데모](https://alvarotrigo.com/fullPage/) | [Codepen](https://codepen.io/alvarotrigo/pen/NxyPPp)\n- [Wordpress plugin for Gutenberg](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/) and [WordPress pluging fo Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/)\n- [워드프레스 테마](https://alvarotrigo.com/fullPage/utils/wordpress.html)\n- [fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/)\n- [자주 묻는 질문(FAQ)](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions)\n- [[Migration from fullPage v3 to fullpage v4]](https://alvarotrigo.com/fullPage/help/migration-from-fullpage-3/)\n---\n\n(단일 페이지 웹사이트 또는 한페이지 사이트로도 알려진) 전체 화면 스크롤 웹사이트를 만드는 간단하고 쓰기 쉬운 라이브러리입니다. 전체 화면 스크롤 웹사이트를 만들 수 있으며 웹사이트 구역 안에 수평 방향 슬라이더를 추가할 수 있습니다.\n\n\n- [소개](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean/#%EC%86%8C%EA%B0%9C)\n- [호환성](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%ED%98%B8%ED%99%98%EC%84%B1)\n- [라이선스](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EB%9D%BC%EC%9D%B4%EC%84%A0%EC%8A%A4)\n- [사용법](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EC%82%AC%EC%9A%A9%EB%B2%95)\n  - [구역 또는 슬라이드로 가는 링크 만들기](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EA%B5%AC%EC%97%AD-%EB%98%90%EB%8A%94-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C%EB%A1%9C-%EA%B0%80%EB%8A%94-%EB%A7%81%ED%81%AC-%EB%A7%8C%EB%93%A4%EA%B8%B0)\n  - [구역을 더 작게 또는 크게 만들기](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EA%B5%AC%EC%97%AD%EC%9D%84-%EB%8D%94-%EC%9E%91%EA%B2%8C-%EB%98%90%EB%8A%94-%ED%81%AC%EA%B2%8C-%EB%A7%8C%EB%93%A4%EA%B8%B0)\n  - [fullpage.js가 추가하는 상태 클래스](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#fullpagejs%EA%B0%80-%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94-%EC%83%81%ED%83%9C-%ED%81%B4%EB%9E%98%EC%8A%A4)\n  - [지연 로딩](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EC%A7%80%EC%97%B0-%EB%A1%9C%EB%94%A9)\n  - [미디어 자동 재생/일시정지 삽입](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EB%AF%B8%EB%94%94%EC%96%B4-%EC%9E%90%EB%8F%99-%EC%9E%AC%EC%83%9D%EC%9D%BC%EC%8B%9C%EC%A0%95%EC%A7%80-%EC%82%BD%EC%9E%85)\n  - [확장 프로그램 사용](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%ED%99%95%EC%9E%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%82%AC%EC%9A%A9)\n- [옵션](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EC%98%B5%EC%85%98)\n- [방법](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EB%B0%A9%EB%B2%95)\n- [콜백](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EC%BD%9C%EB%B0%B1)\n- [문제 알리기](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EB%AC%B8%EC%A0%9C-%EC%95%8C%EB%A6%AC%EA%B8%B0)\n- [fullpage.js에 기여하기](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#fullpagejs%EC%97%90-%EA%B8%B0%EC%97%AC%ED%95%98%EA%B8%B0)\n- [수정 일지](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EC%88%98%EC%A0%95-%EC%9D%BC%EC%A7%80)\n- [구축 도전](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EA%B5%AC%EC%B6%95-%EB%8F%84%EC%A0%84)\n- [재료가 되는 도구](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EC%9E%AC%EB%A3%8C%EA%B0%80-%EB%90%98%EB%8A%94-%EB%8F%84%EA%B5%AC)\n- [누가 fullPage.js를 쓰나요?](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EB%88%84%EA%B0%80-fullpagejs%EB%A5%BC-%EC%93%B0%EB%82%98%EC%9A%94)\n- [기부](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EA%B8%B0%EB%B6%80)\n\n## 소개\n기능 요청뿐만 아니라 코딩 스타일 개선까지 언제든 의견 제안을 매우 환영합니다.\n이 라이브러리를 멋지게 만들어서 사람들의 삶을 더 편리하게 가꾸어 보아요!\n\n## 호환성\nfullPage.js는 모든 최신 브라우저와 IE 11에서 완벽하게 동작합니다. IE 11이하 버전을 지원해야 한다면 [fullPage.js v3](https://github.com/alvarotrigo/fullPage.js/tree/3.1.2) 사용을 고려하세요. 또한 모바일 폰, 태블릿, 터치 스크린 컴퓨터에서의 터치 지원도 제공합니다.\n\nfullpage.js를 지원해 주시는 [Browserstack](https://www.browserstack.com/)에게 특별히 감사드립니다.\n\n## 라이선스\n\n### 상업 라이선스\nfullPage를 써서 상업용 웹사이트, 주제, 프로젝트, 앱을 개발하고자 하신다면 상업 라이선스가 적절합니다. 상업 라이선스로 귀하의 소스 코드에 저작권을 부여하실 수 있습니다. 다시 말해 귀하의 앱의 전 소스 코드를 오픈 소스 라이선스로 바꾸시지 않아도 된다는 것입니다. [[여기서 Fullpage 상업 라이선스를 구매하세요]](https://alvarotrigo.com/fullPage/pricing/)\n\n### 오픈소스 라이선스\n[GNU GPL 라이선스 v3](https://www.gnu.org/licenses/gpl-3.0.html)과 호환되는 라이선스 하에서 오픈소스 앱을 만드신다면, GPLv3 조건에서 fullPage를 사용하실 수 있습니다.\n\n**fullPage.js가 사용되고 있음을 명확히 알려야 합니다. 자바스크립트와 CSS 파일에 있는 개발자를 밝히는 말은 (결합이나 최소화 이후에도) 그대로 두셔야 합니다**\n\n[fullPage의 라이선스에 대해 더 자세히 읽어보기](https://alvarotrigo.com/fullPage/pricing/).\n\n## 사용법\n예시 파일에서 보실 수 있듯이 다음을 넣으셔야 합니다.\n - `fullpage.js` 자바스크립트 파일 (또는 더 작아진 버전인 `fullpage.min.js`)\n - `fullpage.css`css 파일\n\n **선택 사항으로**`css3:false`를 쓰실 때 라이브러리에 들어있는 효과(`easeInOutCubic`) 이외에 다른 easing 효과를 쓰고 싶으시다면 [easing 파일](https://github.com/alvarotrigo/fullPage.js/tree/master/vendors/easings.min.js)를 추가하실 수 있습니다.\n\n### bower 또는 npm을 써서 설치하기\n**선택 사항으로**, 만약 아래가 더 마음에 드신다면 fullPage.js를 bower나 npm과 함께 설치하실 수 있습니다.\n\n터미널:\n```shell\n// bower 사용시\nbower install fullpage.js\n\n// npm 사용시\nnpm install fullpage.js\n```\n\n### 들어가는 파일:\n```html\n<link rel=\"stylesheet\" type=\"text/css\" href=\"fullpage.css\" />\n\n<!-- 아래는 선택사항입니다. css3:false 옵션을 쓰시면서 \"linear\", \"swing\" 또는 \"easeInOutCubic\" 대신 다른 전환(easing) 효과를 원하시는 경우에만 필요합니다. -->\n<script src=\"vendors/easings.min.js\"></script>\n\n<script type=\"text/javascript\" src=\"fullpage.js\"></script>\n```\n\nWebpack, Browserify 또는 Require.js를 사용하고 계신가요? [모듈 로더와 함께 fullPage.js를 사용하는 방법을 확인하세요.](https://github.com/alvarotrigo/fullPage.js/wiki/Use-module-loaders-for-fullPage.js).\n\n### CDN 사용 가능\n필요한 파일을 불러오실 때 CDN이 더 편하시다면 [JSDelivr](https://www.jsdelivr.com/package/npm/fullpage.js), [UNPKG](https://unpkg.com/browse/fullpage.js/dist/), [CDNJS](https://cdnjs.com/libraries/fullPage.js)에서도 fullPage.js를 사용할 수 있습니다.\n\n\n### 필요한 HTML 구조\nHTML 코드의 첫번째 줄에 필수 [HTML DOCTYPE 표기](https://www.corelangs.com/html/introduction/doctype.html)를 넣어주세요. 넣지 않으시면 구역의 높이가 깨질 수 있습니다. 제시된 사례에서는 HTML 5 doctype `<!DOCTYPE html>`을 씁니다.\n\n각 구역은 `section` 클래스가 들어간 요소로 정의됩니다. 첫 번째 구역은 기본 설정으로 활성화되어 홈페이지가 됩니다.\n\n구역이 포장 안에 들어가야 합니다(이 경우에는 `<div id=\"fullpage\">`). 포장은 `body` 요소가 될 수 없습니다.\n```html\n<div id=\"fullpage\">\n\t<div class=\"section\">Some section</div>\n\t<div class=\"section\">Some section</div>\n\t<div class=\"section\">Some section</div>\n\t<div class=\"section\">Some section</div>\n</div>\n```\n첫번째 구역이나 구역의 첫번째 슬라이드 이외에 다른 곳을 출발점으로 정의하고 싶으시다면 처음 불러오시려는 구역과 슬라이드에 `active` 클래스를 추가하시기만 하면 됩니다.\n```html\n<div class=\"section active\">Some section</div>\n```\n\n구역 내에 수평 방향 슬라이더를 만들기 위해 기본 설정으로 각 슬라이드가 `slide` 클래스가 들어 있는 요소로 정의됩니다.\n```html\n<div class=\"section\">\n\t<div class=\"slide\"> Slide 1 </div>\n\t<div class=\"slide\"> Slide 2 </div>\n\t<div class=\"slide\"> Slide 3 </div>\n\t<div class=\"slide\"> Slide 4 </div>\n</div>\n````\n[`simple.html` 파일](https://github.com/alvarotrigo/fullPage.js/tree/master/examples/simple.html)에서 완전히 구현되는 HTML 구조 예시를 보실 수 있습니다.\n\n### 초기 설정\n\n#### 바닐라 자바스크립트를 사용한 초기화\n`</body>` 태그를 닫기 전 fullpage.js를 불러오기만 하시면 됩니다.\n\n```javascript\nnew fullpage('#fullpage', {\n\t//options here\n\tautoScrolling:true,\n\tscrollHorizontally: true\n});\n```\n\n#### jQuery를 사용한 초기화\n원하실 경우 fullpage.js를 jQuery 플러그인으로 쓰실 수 있습니다!\n\n```javascript\n$(document).ready(function() {\n\t$('#fullpage').fullpage({\n\t\t//options here\n\t\tautoScrolling:true,\n\t\tscrollHorizontally: true\n\t});\n\n\t// Example of how to use fullpage.js methods\n\t$.fn.fullpage.setAllowScrolling(false);\n});\n```\n\n#### 모든 옵션이 들어간 바닐라 JS 예시\n\n모든 옵션이 들어간 더 복잡한 초기 설정은 아래와 같이 코딩될 수 있습니다.\n```javascript\nnew fullpage('#fullpage', {\n\t// 이동\n\tmenu: '#menu',\n\tlockAnchors: false,\n\tanchors:['firstPage', 'secondPage'],\n\tnavigation: false,\n\tnavigationPosition: 'right',\n\tnavigationTooltips: ['firstSlide', 'secondSlide'],\n\tshowActiveTooltip: false,\n\tslidesNavigation: false,\n\tslidesNavPosition: 'bottom',\n\n\t// 스크롤\n\tcss3: true,\n\tscrollingSpeed: 700,\n\tautoScrolling: true,\n\tfitToSection: true,\n\tfitToSectionDelay: 600,\n\tscrollBar: false,\n\teasing: 'easeInOutCubic',\n\teasingcss3: 'ease',\n\tloopBottom: false,\n\tloopTop: false,\n\tloopHorizontal: true,\n\tcontinuousVertical: false,\n\tcontinuousHorizontal: false,\n\tscrollHorizontally: false,\n\tinterlockedSlides: false,\n\tdragAndMove: false,\n\toffsetSections: false,\n\tresetSliders: false,\n\tfadingEffect: false,\n\tnormalScrollElements: '#element1, .element2',\n\tscrollOverflow: true,\n\tscrollOverflowMacStyle: false,\n\tscrollOverflowReset: false,\n\ttouchSensitivity: 15,\n\tbigSectionsDestination: null,\n\tadjustOnNavChange: true,\n\n\t// 접근성\n\tkeyboardScrolling: true,\n\tanimateAnchor: true,\n\trecordHistory: true,\n\n\t// 디자인\n\tcontrolArrows: true,\n\tcontrolArrowsHTML: [\n\t\t'<div class=\"fp-arrow\"></div>', \n\t\t'<div class=\"fp-arrow\"></div>'\n\t],\n\tverticalCentered: true,\n\tsectionsColor : ['#ccc', '#fff'],\n\tpaddingTop: '3em',\n\tpaddingBottom: '10px',\n\tfixedElements: '#header, .footer',\n\tresponsiveWidth: 0,\n\tresponsiveHeight: 0,\n\tresponsiveSlides: false,\n\tcinematic: false,\n\tcinematicOptions: [Object],\n\teffects: false,\n\teffectsOptions: [Object],\n\tparallax: false,\n\tparallaxOptions: {type: 'reveal', percentage: 62, property: 'translate'},\n\tdropEffect: false,\n\tdropEffectOptions: { speed: 2300, color: '#F82F4D', zIndex: 9999},\n\twaterEffect: false,\n\twaterEffectOptions: { animateContent: true, animateOnMouseMove: true},\n\tcards: false,\n\tcardsOptions: {perspective: 100, fadeContent: true, fadeBackground: true},\n\n\t// 맞춤 선택자\n\tsectionSelector: '.section',\n\tslideSelector: '.slide',\n\n\tlazyLoading: true,\n\tlazyLoadThreshold: 0,\n\tobserver: true,\n\tcredits: { enabled: true, label: 'Made with fullPage.js', position: 'right'},\n\n\t// 사건(이벤트)\n\tbeforeLeave: function(origin, destination, direction, trigger){},\n\tonLeave: function(origin, destination, direction, trigger){},\n\tafterLoad: function(origin, destination, direction, trigger){},\n\tafterRender: function(){},\n\tafterResize: function(width, height){},\n\tafterReBuild: function(){},\n\tafterResponsive: function(isResponsive){},\n\tafterSlideLoad: function(section, origin, destination, direction, trigger){},\n\tonSlideLeave: function(section, origin, destination, direction, trigger){},\n\tonScrollOverflow: function(section, slide, position, direction){}\n});\n```\n\n### 구역 또는 슬라이드로 가는 링크 만들기\nfullPage.js를 (`anchors 옵션이나 각 구역마다 `data-anchor 속성을 쓰셔서) 구역의 앵커 링크와 쓰신다면 앵커 링크를 통해 구역 내부 특정 슬라이드로 바로 가실 수 있습니다.\n\n앵커가 들어간 링크 예시는 다음과 같습니다. https://alvarotrigo.com/fullPage/#secondPage/2 (해당 구역/슬라이드에 수동으로 가신다면 보시게 될 URL입니다) URL의 끝부분이 `#secondPage/2`로 끝나는 것에 주목해 주세요.\n\n초기 설정이 다음과 같이 설정될 경우\n\n```javascript\nnew fullpage('#fullpage', {\n\tanchors:['firstPage', 'secondPage', 'thirdPage']\n});\n```\n\n`#secondPage/2` URL 끝에 있는 앵커가 목적지 구역과 슬라이드를 각각 정의합니다. 이전 URL에서는 `secondPage` 앵커로 정의된 구역이 목적지이고, 목적지 슬라이드는 색인으로 2를 쓰고 있기 때문에 두번째 슬라이드가 됩니다. (구역의 첫번째 슬라이드는 엄밀히 말해 구역이기 때문에 색인이 0입니다.)\n\nHTML 교정(마크업)에서 `data-anchor` 속성을 쓴다면 슬라이드에 색인 대신 맞춤화된 앵커를 쓸 수도 있습니다.\n\n```html\n<div class=\"section\">\n\t<div class=\"slide\" data-anchor=\"slide1\"> Slide 1 </div>\n\t<div class=\"slide\" data-anchor=\"slide2\"> Slide 2 </div>\n\t<div class=\"slide\" data-anchor=\"slide3\"> Slide 3 </div>\n\t<div class=\"slide\" data-anchor=\"slide4\"> Slide 4 </div>\n</div>\n```\n이 마지막 사례에서는 이전에 다뤘던 `#secondPage/2`와 동일한 역할을 하는 `#secondPage/slide3` URL을 쓰게 됩니다.\n\n만약 `anchors` 배열이 없다면 `data-anchor` 속성을 써서 동일하게 구역 앵커를 정의할 수 있음을 기억해 주세요.\n\n**주의하세요!** `data-anchor` 태그는 웹사이트에서 모든 ID 요소(또는 IE의 NAME 요소)와 동일한 값을 지닐 수 없습니다.\n\n### 구역을 더 작게 또는 크게 만들기\n[데모](https://codepen.io/alvarotrigo/pen/BKjRYm) fullPage.js는 구역과 슬라이드에서 총 높이 제한을 없애는 방법을 만들어 줍니다. 구역의 높이를 모바일 지원(viewport)보다 더 작거나 크게 만들 수 있습니다. 꼬리말에 적합합니다.\n중요한 건 모든 구역에 이 기능을 쓰실 필요가 없다는 겁니다. 웹사이트를 처음 불러왔을 때 구역 수가 하나를 넘어가면 이미 모바일 지원(viewport)에 있게 되기 때문에 fullPage.js 스크롤이 다음으로 전혀 넘어가지 않습니다.\n\n구역을 작게 만들고 싶으시다면 적용하시고 싶은 구역에 `fp-auto-height` 클래스를 쓰시기만 하면 됩니다. 그러면 구역/슬라이드 컨텐츠에 맞게 높이가 설정됩니다.\n\n```html\n<div class=\"section\">Whole viewport</div>\n<div class=\"section fp-auto-height\">Auto height</div>\n```\n\n#### 반응형 자동 높이 구역\n[데모](https://codepen.io/alvarotrigo/pen/MzByMa) 반응형 자동 높이는 `fp-auto-height-responsive` 클래스로 만드실 수 있습니다. 이렇게 하시면 반응형 모드가 실행되기 전까지는 구역이 전체 화면이 됩니다. 반응형 모드가 실행되면 컨텐츠가 요구하는 크기를 띄게 되는데, 모바일 지원(viewport)보다 더 크거나 작을 수 있습니다.\n\n### fullpage.js가 추가하는 상태 클래스\nFullpage.js는 웹사이트의 상태를 기록하기 위해 여러가지 요소로 다양한 클래스를 추가합니다.\n\n- 현재 보이는 섹션과 슬라이드에 `active`가 추가됩니다.\n- (`menu` 옵션을 사용할 경우) 현재 메뉴 요소에 `active`가 추가됩니다.\n- 섹션 또는 슬라이드 요소가 미디어 콘텐츠의 지연 로드를 트리거하면 `fp-loaded` 클래스가 추가됩니다.\n- 웹사이트의 `body` 요소에 `fp-viewing-SECTION-SLIDE` 형식의 클래스가 추가됩니다. (예: [`fp-viewing-secondPage-0`](https://alvarotrigo.com/fullPage/#secondPage)) `SECTION`과 `SLIDE` 부분은 현재 섹션과 슬라이드의 앵커(앵커가 없을 경우 색인)입니다.\n- 반응형 모드로 전환될 때 `fp-responsive`가 `body` 요소에 추가됩니다.\n- fullPage.js가 활성화되면 `html` 요소에 `fp-enabled`가 추가됩니다. (제거될 때 삭제됩니다.)\n- fullPage.js가 삭제되면 fullPage.js 컨테이너에 `fp-destroyed`가 추가됩니다.\n\n### 지연 로딩\n[데모](https://codepen.io/alvarotrigo/pen/eNLBXo) fullPage.js는 웹사이트가 느려지거나 데이터 전송을 필요 이상으로 낭비하지 않게 그림, 비디오, 소리 요소를 지연 로딩할 수 있는 방법을 지원합니다. 지연 로딩을 쓰면 모바일 지원(viewport) 모드에 들어갈 때에만 이 모든 요소를 불러옵니다. 지연 로딩을 활성화하시려면 아래와 같이 `src` 속성을 `data-src`로 바꾸기만 하시면 됩니다.\n\n```\n<img data-src=\"image.png\">\n<video>\n\t<source data-src=\"video.webm\" type=\"video/webm\" />\n\t<source data-src=\"video.mp4\" type=\"video/mp4\" />\n</video>\n ```\n\n`data-src`를 쓰는 다른 지연 로딩 솔루션을 이미 쓰고 계신다면 `lazyLoading: false` 옵션을 설정하셔서 fullPage.js 지연 로딩을 비활성화하실 수 있습니다.\n\n### 미디어 자동 재생/일시정지 삽입\n\n[데모](https://codepen.io/alvarotrigo/pen/pXEaaK) *주의*: 자동 재생 기능은 ([iOS의 사파리](https://webkit.org/blog/6784/new-video-policies-for-ios/) 10.0 미만 버전 등) OS와 브라우저에 따라 일부 모바일 기기에서는 작동하지 않을 수 있습니다.\n\n#### 구역/슬라이드를 불러올 때 재생:\n비디오나 소리에 `autoplay` 속성을 쓰시거나 유튜브 iframe에 `autoplay=1` 매개변수를 쓰시면 페이지를 불러올 때 미디어 요소가 재생됩니다. 구역/슬라이드를 불러올 때 재생되도록 하려면 대신 `data-autoplay` 속성을 쓰시면 됩니다. 아래는 예시입니다.\n\n```html\n<audio data-autoplay>\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\n</audio>\n```\n\n#### 떠날 때 일시정지\n삽입된 HTML5 `<video>` / `<audio>`와 유튜브 iframe은 구역이나 슬라이드를 떠나실 때 자동으로 일시정지됩니다. 이는 `data-keepplaying` 속성을 쓰시면 비활성화됩니다. 다음은 예시입니다.\n```html\n<audio data-keepplaying>\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\n</audio>\n```\n\n### 확장 프로그램 사용\nfullpage.js는 기본 기능을 강화하기 위해 쓸 수 있는 [여러가지 확장 프로그램을 지원합니다](https://alvarotrigo.com/fullPage/extensions/). 모든 확장 프로그램이 [fullpage.js 옵션](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EC%98%B5%EC%85%98)으로 열거되어 있습니다.\n\n확장 프로그램을 쓰시려면 보통 쓰시는 fullPage.js 파일(`fullpage.js` 또는 `fullpage.min.js`) 말고 [`dist` 폴더](https://github.com/alvarotrigo/fullPage.js/tree/master/dist) 안에 있는 작아진 파일[`fullpage.extensions.min.js`](https://github.com/alvarotrigo/fullPage.js/tree/master/dist/fullpage.extensions.min.js)을 쓰셔야 합니다.\n\n확장 파일을 획득하시면 fullPage 앞에 추가하셔야 합니다. 예를 들어 연속 수평(Continuous Horizontal) 확장을 쓰신다면 확장 파일을 먼저 넣고 그 다음에 fullPage 연장 버전을 넣습니다.\n\n```html\n<script type=\"text/javascript\" src=\"fullpage.continuousHorizontal.min.js\"></script>\n<script type=\"text/javascript\" src=\"fullpage/fullpage.extensions.min.js\"></script>\n```\n\n각 확장 프로그램마다 활성화 키와 라이선스 키가 필요합니다. [더 상세한 사항은 여기를 참조하세요](https://github.com/alvarotrigo/fullPage.js/blob/master/lang/korean/how-to-activate-fullpage-extension.md).\n\n그 다음 [옵션](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EC%98%B5%EC%85%98)에 설명된 대로 사용하시고 설정하실 수 있습니다.\n\n## 옵션\n\n### licenseKey\n(기본값 `null`). **이 옵션은 필수입니다.** fullPage를 비오픈소스 프로젝트에서 쓰신다면 fullPage 상업 라이선스 구매시 받으신 라이선스 키를 쓰셔야 합니다. If your project is open source you can [request a license key](https://alvarotrigo.com/fullPage/extensions/requestKey.html). 라이선스에 관한 더 상세한 정보는 [여기](https://github.com/alvarotrigo/fullPage.js#license)와 [웹사이트에서](https://alvarotrigo.com/fullPage/pricing/) 읽어보실 수 있습니다. 예시:\n\n```javascript\nnew fullpage('#fullpage', {\n\tlicenseKey: 'YOUR_KEY_HERE'\n});\n```\n\n### controlArrows\n(기본값 `true`) 제어 화살표를 눌러서 슬라이드가 오른쪽 또는 왼쪽으로 움직이도록 허용할지 여부를 결정합니다.\n\n### controlArrowsHTML\n(기본값은 `['<div class=\"fp-arrow\"></div>', '<div class=\"fp-arrow\"></div>']`입니다. 이는 수평 슬라이드가 있는 구역의 컨트롤 화살표에 적용할 HTML 구조와 클래스를 정의할 수 있는 방법을 제공합니다. 배열은 두 화살표의 구조를 포함하고 있으며, 첫 번째 항목은 왼쪽 화살표이고, 두 번째는 오른쪽 화살표입니다.)\n\n### verticalCentered\n(기본값 `true`) 구역 내 컨텐츠가 수직으로 중심에 위치하도록 합니다. (flexbox 사용) 본문을 `div`로 감싸는 것이 잠재적인 문제를 피하는 데 도움이 될 수 있습니다. (Uses `flex-direction: column; display: flex; justify-content: center;`)\n\n### scrollingSpeed\n(기본값 `700`) 스크롤 이동 속도를 0.001초 단위로 설정합니다.\n\n### sectionsColor\n(기본값 `none`) 각 구역별 CSS `background-color` 속성을 정의합니다. 아래는 예시입니다.\n\n```javascript\nnew fullpage('#fullpage', {\n\tsectionsColor: ['#f2f2f2', '#4BBFC3', '#7BAABE', 'whitesmoke', '#000'],\n});\n```\n\n### anchors\n(기본값 `[]`) 각 구역별 URL에 보여질 앵커 링크(#예시)를 정의합니다. 앵커값이 고유해야 합니다. 배열 내 앵커의 위치가 어느 구역에 앵커가 적용될지를 정의합니다. (두번째 위치는 두번째 구역에 적용 등). 앵커를 쓰시면 브라우저를 통한 앞뒤 이동도 가능해집니다. 이 옵션을 통해 사용자가 특정 구역이나 슬라이드에 책갈피 표시도 할 수 있습니다. **주의하세요!** 앵커는 웹사이트에서 모든 ID 요소(또는 IE용 NAME 요소)와 동일한 값을 지닐 수 없습니다.\n여기에 설명된 대로 이제는 `data-anchor` 속성을 써서 HTML 구조에서 직접 앵커를 정의할 수 있습니다.\n\n### lockAnchors\n(기본값 `false`) URL에 있는 앵커가 라이브러리에서 효과를 지닐지 말지를 결정합니다. 나만의 기능과 콜백을 위해 여전히 내부에서 앵커를 쓸 수는 있지만 웹사이트 스크롤에는 아무런 효과가 없습니다. URL에 있는 앵커를 써서 fullPage.js를 다른 플러그인과 결합할 때 유용합니다.\n\n### easing\n(기본값 `easeInOutCubic`) 수직 및 수평 스크롤시 전이 효과를 정의합니다.\n[전이](https://api.jqueryui.com/easings/) 효과 중 일부를 사용하기 위해서는  `vendors/easings.min.js` 또는 [jQuery UI](https://jqueryui.com/) 파일이 필요합니다. 대신 다른 라이브러리를 쓸 수도 있습니다.\n\n### easingcss3\n(기본값 `ease`) `css3:true`를 쓰는 경우 사용할 전이 효과를 정의합니다. (`linear`, `ease-out` 등) [미리 정의된 효과](https://www.w3schools.com/cssref/css3_pr_transition-timing-function.asp)를 쓰시거나 `cubic-bezier` 기능을 쓰셔서 나만의 효과를 만드실 수 있습니다. [Matthew Lein CSS Easing Animation Tool](https://matthewlein.com/ceaser/)도 쓰실 수 있습니다.\n\n### loopTop\n(기본값 `false`) 첫번째 구역에서 스크롤을 위로 올릴 때 마지막 구역으로 이동할지 여부를 정의합니다.\n\n### loopBottom\n(기본값 `false`) 마지막 구역에서 스크롤을 아래로 내릴 때 첫번째 구역으로 이동할지 여부를 정의합니다.\n\n### loopHorizontal\n(기본값 `true`) 수평 슬라이더가 마지막이나 이전 슬라이드에 다다른 후 다시 반복할지 여부를 정의합니다.\n\n### css3\n(기본값 `true`). 구역과 슬라이드 안에서 스크롤하기 위해 JavaScript를 쓸지 CSS3을 쓸지를 정의합니다. CSS3 지원 브라우저를 쓰는 태블릿과 스마트폰에서 움직이는 속도를 높이는 데 유용합니다. 이 옵션을 `true`로 설정하고 브라우저가 CSS3을 지원하지 않는다면 폴백(fallback)이 대신 쓰이게 됩니다.\n\n### autoScrolling\n(기본값 `true`) \"automatic\" 스크롤을 쓸지 \"normal\" 스크롤을 쓸지를 정의합니다. 태블릿과 스마트폰 브라우저/기기 창에서 구역이 들어맞는 방법에도 영향을 미칩니다.\n\n### fitToSection\n(기본값 `true`) 구역을 모바일 지원(viewport)에 맞출지 말지를 결정합니다. `true`로 설정하면 현재 활성화된 구역이 항상 모바일 지원(viewport) 전체를 가득 채웁니다. 그렇지 않은 경우에는 사용자는 구역 중간에서 자유롭게 멈출 수 있습니다.\n\n### fitToSectionDelay\n(기본값 1000). `fitToSection`이 true로 설정되면 설정된 1000분의 1초 단위로 맞춤을 지연합니다.\n\n### scrollBar\n(기본값 `false`) 웹사이트에 스크롤 막대기를 쓸지 말지를 결정합니다. 스크롤 막대기를 쓰는 경우 `autoScrolling` 기능이 여전히 예상대로 작동할 것입니다. 또한 사용자는 스크롤 막대기로 웹사이트에서 이동할 수도 있으며 스크롤이 끝나면 fullPage.js가 화면 구역에 맞춰집니다.\n\n### paddingTop\n(기본값 `0`) 구역별 상위에 채우는 부분을 수치와 측정값(`paddingTop: '10px'`, `paddingTop: '10em'`...)으로 정의합니다. 고정된 머리말을 쓰실 때 유용합니다.\n\n### paddingBottom\n(기본값 `0`) 구역별 하위에 채우는 부분을 수치와 측정값(`paddingBottom: '10px'`, `paddingBottom: '10em'`...)으로 정의합니다. 고정된 꼬리말을 쓰실 때 유용합니다.\n\n### fixedElements\n(기본값 `null`) 플러그인의 스크롤 구조에서 어느 요소를 빼낼지를 정의합니다. `css3` 옵션을 쓰실 때 고정하려면 반드시 빼내셔야 합니다. 이 요소에는 Javascript 선택자가 들어간 문자열이 필요합니다. (예시: `fixedElements: '#element1, .element2'`)\n\n### normalScrollElements\n(기본값 `null`) [데모](https://codepen.io/alvarotrigo/pen/RmVazM) 일부 요소 위를 스크롤할때 자동 스크롤을 피하고 싶으시다면 이 옵션을 쓰셔야 합니다. (지도, div 스크롤 등에 유용.) 이 요소에는 Javascript 선택자가 들어간 문자열이 필요합니다. (예시: `normalScrollElements: '#element1, .element2'`)\n\n### bigSectionsDestination\n(기본값 `null`) [데모](https://codepen.io/alvarotrigo/pen/vYLdMrx) 모바일 지원(viewport)보다 더 큰 구역으로 어떻게 스크롤하는지 정의합니다. 기본 설정시 fullPage.js는 목적지 위에 있는 구역에서 내려오는 경우 상위로 스크롤하고 목적지 아래에 있는 구역에서 올라오는 경우 하위로 스크롤합니다. `top`, `bottom`, `null` 값이 가능합니다.\n\n### adjustOnNavChange\n(기본값 `true`)\nfullPage.js가 모바일 네비게이션 또는 주소창의 크기가 변경되거나 표시 여부가 전환될 때 섹션의 높이를 조정할지 여부를 정의합니다. `false` 로 설정하면, 네비게이션 바가 축소되거나 숨겨질 때 섹션이 전체 높이로 나타나지 않습니다.\n\n### keyboardScrolling\n(기본값 `true`) 키보드를 써서 컨텐츠 사이를 이동할 수 있는지 정의합니다.\n\n### touchSensitivity\n(기본값 `5`) 브라우저 창 너비/폭 퍼센트와 다음 구역 / 슬라이드로 이동하는 데 필요한 스와이프 거리를 정의합니다.\n\n### skipIntermediateItems\n(기본값 `false`). 연속되지 않은 수직 섹션 또는 수평 슬라이드 간에 탐색할 때 스크롤 애니메이션을 건너뛸지 여부를 결정합니다. 가능한 값은 `true`, `false`, `sections`, `slides`이며, 이 동작을 수직, 수평, 또는 두 방향 모두에 적용할 수 있습니다.\n\n\n### continuousVertical\n(기본값 `false`) 마지막 구역에서 아래로 스크롤할때 첫번째 구역으로 스크롤이 내려가야 할지를 정의하고, 첫번째 구역에서 위로 스크롤할때 마지막 구역으로 스크롤이 올라가야 할지를 정의합니다. `loopTop`, `loopBottom` 또는 웹사이트에 있는 모든 스크롤 막대기와 호환되지 않습니다. (`scrollBar:true` 또는 `autoScrolling:false`)\n\n### continuousHorizontal\n(기본값 `false`) [fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/). 마지막 슬라이드에서 오른쪽으로 미끄러질 때 오른쪽으로 이동하여 첫번째 슬라이드로 이동할지를 정의하고, 첫번째 슬라이드에서 왼쪽으로 스크롤할때 왼쪽으로 이동하면서 마지막 슬라이드로 이동할지를 정의합니다. `loopHorizontal`과 호환되지 않습니다. fullpage.js 버전이 3.0.1 이상이어야 합니다.\n\n### scrollHorizontally\n(기본값 `false`) [fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/). 슬라이더 안에서 마우스 휠 또는 트랙패드를 써서 수평으로 미끄러지듯 움직일지를 정의합니다. 이야기 전달에 적합합니다. It can only be used when using: `autoScrolling:true`. fullpage.js 버전이 3.0.1 이상이어야 합니다.\n\n### interlockedSlides\n(기본값 `false`) [fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/). 수평 슬라이더 하나를 움직일 때 다른 구역에 있는 슬라이더가 강제로 같은 방향으로 미끄러지도록 할지를 정의합니다. `true`, `false` 또는 서로 잠긴 구역이 있는 배열값이 가능합니다. 예를 들면 1에서 시작하는 `[1,3,5]`가 가능합니다. fullpage.js 버전이 3.0.1 이상이어야 합니다.\n\n### dragAndMove\n(기본값 `false`) [fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/). 마우스나 손가락을 써서 구역과 슬라이드를 끌어오고 튕기는 걸 활성화하거나 비활성화합니다. fullpage.js 버전이 3.0.1 이상이어야 합니다. 아래 값을 쓰실 수 있습니다.\n  - ` true`: 기능 활성화.\n  - ` false`: 기능 비활성화.\n  - `vertical`: 수직으로만 기능 구현.\n  - `horizontal`: 수평으로만 기능 구현.\n  - `fingersonly`: 터치 기기에서만 기능 구현.\n  - `mouseonly`: 데스크탑 기기에서만 기능 구현(마우스와 트랙패드).\n\n### offsetSections\n(기본값 `false`)[fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/). 전체화면이 아닌 구역을 퍼센트에 기반하여 쓸 수 있는 방법을 지원합니다. 방문객에게 다음이나 이전 구역의 일부를 보여줌으로써 웹사이트에 더 많은 컨텐츠가 있음을 보여주는 데 적합합니다. fullPage.js 버전이 3.0.1 이상이어야 합니다. 각 구역의 퍼센트를 정의하려면 `data-percentage` 속성을 쓰셔야 합니다. `data-centered` 속성에서 불리언(boolean) 값을 써서 모바일 지원(viewport)에서 구역이 중앙에 오도록 정의할 수 있습니다(명시하지 않을 경우 `true`가 기본값). 다음은 예시입니다.\n\n``` html\n<div class=\"section\" data-percentage=\"80\" data-centered=\"true\">\n```\n\n### resetSliders\n(기본값 `false`). [fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/). 구역을 떠난 후 모든 슬라이더가 제자리로 돌아가도록 할지를 정의합니다. fullpage.js 버전이 3.0.1 이상이어야 합니다.\n\n### fadingEffect\n(기본값 `false`). [fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/). 기본설정인 스크롤 효과 대신 사라지는 효과를 쓸지를 정의합니다. `true`, `false`, `sections`, `slides` 값이 가능합니다. 그러므로 수직이나 수평 또는 수직 수평이 동시에 적용되는 것만 가능합니다. fullpage.js 버전이 3.0.1 이상이어야 합니다.\n\n### animateAnchor\n(기본값 `true`) 앵커(#)가 주어질 때 웹사이트를 불러오면 애니메이션이 들어간 스크롤 형태로 목적지로 이동할지, 아니면 주어진 구역에서 바로 불러올지를 정의합니다.\n\n### recordHistory\n(기본값 `true`) 웹사이트 상태를 브라우저 방문 기록에 맞게 밀지를 정의합니다. `true`로 설정되면 웹사이트의 각 구역/슬라이드가 새로운 페이지가 되어 브라우저의 뒤로 가기/앞으로 가기 버튼을 누르면 구역/슬라이드를 스크롤하여 웹사이트의 이전 방문 페이지나 다음 페이지로 이동합니다. `false`로 설정되면 URL이 계속 바뀌어도 브라우저 방문 기록에 아무런 영향을 미치지 않습니다. `autoScrolling:false`값을 쓰면 이 옵션이 자동으로 꺼집니다.\n\n### menu\n(기본값 `false`) 선택자를 써서 구역에 링크할 메뉴를 구체적으로 정할 수 있습니다. 이렇게 하면 `active` 클래스를 써서 구역을 스크롤할때 메뉴에 있는 대응하는 요소가 활성화됩니다. 이렇게 하면 메뉴를 만드는 것이 아니라 `active` 클래스를 대응하는 앵커 링크와 함께 주어진 메뉴에 있는 요소에 추가만 합니다. 구역에 메뉴 요소의 링크를 걸기 위해서는 구역 안에서 사용된 것과 동일한 앵커 링크와 함께 사용하기 위해 HTML 5 데이터-태크(`data-menuanchor`)가 필요합니다. 다음은 예시입니다.\n\n```html\n<ul id=\"myMenu\">\n\t<li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">First section</a></li>\n\t<li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second section</a></li>\n\t<li data-menuanchor=\"thirdPage\"><a href=\"#thirdPage\">Third section</a></li>\n\t<li data-menuanchor=\"fourthPage\"><a href=\"#fourthPage\">Fourth section</a></li>\n</ul>\n```\n```javascript\nnew fullpage('#fullpage', {\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\n\tmenu: '#myMenu'\n});\n```\n\n**주의:** `css3:true`를 쓸 때 문제가 생기지 않도록 하려면 메뉴 요소를 전체 페이지 포장 밖에 두셔야 합니다. 그렇지 않으면 플러그인 자체가 메뉴 요소를 `body`에 덧붙여 버립니다.\n\n### navigation\n(기본값 `false`) `true`로 설정되면 작은 원으로 이루어진 이동 막대기가 나타납니다.\n\n### navigationPosition\n(기본값 `none`) `left`나 `right`로 설정될 수 있습니다. (만약 쓰실 경우) 이동 막대기가 보여지는 위치를 정의합니다.\n\n### navigationTooltips\n(기본값 []) 이동 원을 쓰시는 경우 보여질 말풍선 위젯을 정의합니다. 다음은 예시입니다. `navigationTooltips: ['firstSlide', 'secondSlide']`. 원하신다면 구역마다 `data-tooltip` 속성을 쓰셔서 정의할 수 있습니다.\n\n### showActiveTooltip\n(기본값 `false`) 수직으로 이동할때 능동적 구역 보기를 위해 계속 따라다니는 말풍선 위젯을 보여줍니다.\n\n### slidesNavigation\n(기본값 `false`) `true`로 설정되면 웹사이트에서 각 수평방향 슬라이더마다 작은 원으로 이루어진 이동 막대기를 보여줍니다.\n\n### slidesNavPosition\n(기본값 `bottom`) 수평방향 이동 막대기 슬라이더 위치를 지정합니다. `top`과 `bottom`을 값으로 인정합니다. 상부 또는 하부에서의 거리와 색깔 등 다른 모든 스타일을 정의하려면 CSS 스타일을 수정하시면 됩니다.\n\n### scrollOverflow\n(기본값 `false`) 컨텐츠가 구역/슬라이드의 높이보다 더 큰 경우 스크롤을 만들지 여부를 정의합니다. `true`로 설정되면 컨텐츠가 플러그인으로 포장됩니다.It requires the default value `scrollBar: false`. 특정 구역이나 슬라이드에서 fullpage.js의 스크롤 막대기를 생성하고 싶지 않으시다면 `fp-noscroll` 클래스를 쓰세요. 예시: `<div class=\"section fp-noscroll\">`. 구역 요소에서 `fp-auto-height-responsive`를 쓰시면 반응형 모드에서는 scrolloverflow가 적용되지 않습니다.\n\n### scrollOverflowMacStyle\n(기본값 `false`). 활성화되면 이 옵션은 기본 스크롤바 대신 \"맥 스타일\"의 스크롤바를 사용하게 되며, 윈도우 컴퓨터에서는 다르게 보일 것입니다.\n\n### scrollOverflowReset\n(기본값 `false`) [fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/). `true`로 설정되면 다른 수직 구역으로 옮겨갈 때 구역/슬라이드의 컨텐츠를 스크롤 막대기와 함께 위로 스크롤합니다. 이렇게 하면 구역/슬라이드 아래에서 스크롤하더라도 언제나 컨텐츠 처음 부분을 볼 수 있습니다. 가능한 값은 `true`, `false`, `sections`, `slides`입니다. 구역 또는 슬라이드에 `fp-no-scrollOverflowReset` 클래스를 추가하면 해당 패널에 대해 이 기능이 비활성화됩니다.\n\n### sectionSelector\n(기본값 `.section`) 플러그인 구역에 쓰이는 Javascript 선택자를 정의합니다. fullpage.js와 동일한 선택자를 쓰는 다른 플러그인과 문제를 일으키지 않도록 가끔 변경해야 할 수도 있습니다.\n\n### slideSelector\n(기본값 `.slide`) 플러그인 슬라이드에 쓰이는 Javascript 선택자를 정의합니다. fullpage.js와 동일한 선택자를 쓰는 다른 플러그인과 문제를 일으키지 않도록 가끔 변경해야 할 수도 있습니다.\n\n### responsiveWidth\n(기본값 `0`) 픽셀로 정의된 폭 아래에 정상 스크롤(`autoScrolling:false`)을 씁니다. 사용자가 자신만의 반응형 CSS에 쓰고 싶은 경우를 위해 `fp-responsive` 클래스가 바디 태그에 추가됩니다. 예를 들어 900에 설정되는 경우 브라우저의 너비가 900 미만이 될 때마다 플러그인이 정상 웹사이트처럼 스크롤됩니다.\n\n### responsiveHeight\n(기본값 `0`) 픽셀로 정의된 높이 아래에 정상 스크롤(`autoScrolling:false`)을 씁니다. 사용자가 자신만의 반응형 CSS에 쓰고 싶은 경우를 위해 `fp-responsive` 클래스가 바디 태그에 추가됩니다. 예를 들어 900에 설정되는 경우 브라우저의 높이가 900 미만이 될 때마다 플러그인이 정상 웹사이트처럼 스크롤됩니다.\n\n### responsiveSlides\n(기본값 `false`) [fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/). `true`로 설정될 경우 반응형 모드가 실행되면 슬라이드가 수직 구역으로 바뀝니다. (위에 상세히 설명된 `responsiveWidth` 또는 `responsiveHeight` 옵션을 써서 구현됩니다). fullpage.js 버전이 3.0.1 이상이어야 합니다.\n\n### cinematic\n\n(기본값 `false`) [fullPage.js 확장 기능](https://alvarotrigo.com/fullPage/extensions/cinematic.html). 섹션에서 슬라이더 효과를 활성화하거나 비활성화합니다. fullpage.js >= 4.0.41 이 필요합니다.\n\n### cinematicOptions\n\n(기본값: `{Object}`) `cinematic:true` 옵션을 사용할 때 콘텐츠 애니메이션의 매개변수를 설정할 수 있습니다. [자세히 보기](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cinematic-Effects#cinematicoptions).\n\n### effects\n(기본값: `false`) [fullpage.js 확장 기능](https://alvarotrigo.com/fullPage/extensions/slider-effects.html). 섹션에 슬라이더 효과를 활성화하거나 비활성화합니다. fullpage.js >= 4.0.35 필요\n\n### effectsOptions\n(기본값: `{Object}` [\"focus\" 프리셋](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#20-available-presetss)의 구성).  \n`effects:true` 옵션을 사용할 때 효과에 대한 매개변수를 구성할 수 있습니다. [effects 옵션 적용 방법에 대해 자세히 알아보기](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#effects-options-documentation)\n\n### parallax\n(기본값 `false`) [fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/). 구역 / 슬라이드에서 패럴랙스 배경 효과를 쓸지 여부를 정의합니다. [패럴랙스 옵션을 어떻게 적용하는지 읽어보세요](https://github.com/alvarotrigo/fullPage.js/blob/master/lang/korean/parallax-extension.md).\n\n### parallaxOptions\n(기본값: `{ type: 'reveal', percentage: 62, property: 'translate'}`). \nparallax:true 옵션을 쓰실 때 패럴랙스 배경 효과 매개변수를 설정하실 수 있습니다. [패럴랙스 옵션을 어떻게 적용하는지 읽어보세요](https://github.com/alvarotrigo/fullPage.js/blob/master/lang/korean/parallax-extension.md).\n\n### dropEffect\n(기본값 `false`) [fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/). 구역 또는 슬라이드에 드롭 효과를 사용할지 여부를 정의합니다. [드롭 효과 옵션 적용 방법에 대해 자세히 알아보세요](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect).\n\n### dropEffectOptions\n(기본값: `{ speed: 2300, color: '#F82F4D', zIndex: 9999}`). \n`dropEffect:true` 옵션을 사용할 때 드롭 효과의 파라미터를 설정할 수 있습니다.[드롭 효과 옵션 적용 방법에 대해 자세히 알아보세요](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect).\n\n### waterEffect\n(기본값 `false`) [fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/). 구역 또는 슬라이드에 워터 효과를 사용할지 여부를 정의합니다. [워터 효과 옵션 적용 방법에 대해 자세히 알아보세요](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect).\n\n### waterEffectOptions\n(기본값: `{ animateContent: true, animateOnMouseMove: true}`). \n`waterEffect:true` 옵션을 사용할 때 워터 효과의 파라미터를 설정할 수 있습니다. [워터 효과 옵션 적용 방법에 대해 자세히 알아보세요](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect).\n\n### cards\n(기본값 `false`) [fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/). 구역 또는 슬라이드에 카드 효과를 사용할지 여부를 정의합니다. [카드 옵션 적용 방법에 대해 자세히 알아보세요](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards).\n\n### cardsOptions\n(기본값: `{ perspective: 100, fadeContent: true, fadeBackground: true}`). \n`cards:true` 옵션을 사용할 때 카드 효과의 파라미터를 설정할 수 있습니다. [카드 옵션 적용 방법에 대해 자세히 알아보세요](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards).\n\n### lazyLoading\n(기본값 `true`) 기본 설정으로 지연 로딩이 활성화됩니다. [지연 로딩 문서](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EC%A7%80%EC%97%B0-%EB%A1%9C%EB%94%A9)에 자세히 설명된 대로 `data-src` 속성을 지닌 모든 미디어 요소를 지연 로딩합니다. 이외 다른 지연 로딩 라이브러리를 쓰고 싶으시다면 이 fullpage.js 기능을 비활성화하실 수 있습니다.\n\n### lazyLoadThreshold\n(기본값 `0`) 현재 섹션을 기준으로 인접한 수직 섹션 및 수평 슬라이드의 미디어 요소가 지연 로드되어야 하는 수를 지정합니다. 이전 및 다음 섹션이나 슬라이드를 몇 개 미리 로드할지 숫자로 지정하세요.\n\n### observer\n(기본값 `true`) 페이지의 HTML 구조 변경을 감지할지 여부를 정의합니다. 활성화되면 fullPage.js는 해당 변경 사항에 자동으로 반응하여 자체를 업데이트합니다. 구역 또는 슬라이드를 추가, 제거하거나 숨길 때 이상적입니다.\n\n### credits\n(기본값 `{enabled: true, label: 'Made with fullpage.js', position: 'right'}`). fullPage.js 저작권 표시를 사용할지를 정의합니다. GPLv3 라이선스의 조항 0, 4, 5, 7에 따라, GPLv3 하에 fullPage.js를 사용하는 사용자는 fullPage.js 사용 중임을 명확하게 표시해야 합니다. 이 옵션을 활성화하여 저작권 표시를 포함하는 것을 권장합니다. **참고:** 이 옵션에는 유효한 `licenseKey` 값이 필요합니다.\n\n## 방법\n어떻게 작동하는지 [여기](https://alvarotrigo.com/fullPage/examples/methods.html)서 보실 수 있습니다.\n\n### getActiveSection\n[데모](https://codepen.io/alvarotrigo/pen/VdpzRN/) 활성화된 슬라이드 및 슬라이드 특성이 들어간 객체(type [Section](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#callbacks))를 얻습니다.\n\n```javascript\nfullpage_api.getActiveSection();\n```\n\n### getActiveSlide\n[데모](https://codepen.io/alvarotrigo/pen/VdpzRN/) 활성화된 구역 및 구역 특성이 들어간 객체(type [Slide](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#callbacks))를 얻습니다.\n\n```javascript\nfullpage_api.getActiveSlide();\n```\n\n### getScrollY() & getScrollX\n[데모](https://codepen.io/alvarotrigo/pen/GRyGqro) `getScrollY` fullPage Wrapper의 Y 축 위치를 가져옵니다. `getScrollX` 는 활성 수평 슬라이드의 X 축 위치를 가져옵니다.\n\n```javascript\nfullpage_api.getScrollY();\nfullpage_api.getScrollX();\n```\n\n### moveSectionUp()\n[데모](https://codepen.io/alvarotrigo/pen/GJXNMN) [데모](https://codepen.io/alvarotrigo/pen/GJXNMN) 한 구역 위로 스크롤합니다.\n```javascript\nfullpage_api.moveSectionUp();\n```\n---\n### moveSectionDown()\n[데모](https://codepen.io/alvarotrigo/pen/jPvVZx) 한 구역 아래로 스크롤합니다.\n```javascript\nfullpage_api.moveSectionDown();\n```\n---\n### moveTo(구역, 슬라이드)\n[데모](https://codepen.io/alvarotrigo/pen/doqOmY) 페이지를 주어진 구역과 슬라이드로 스크롤합니다. 기본 설정으로 보이는 첫번째 페이지가 색인 0이 됩니다.\n```javascript\n/*`firstSlide` 앵커 링크가 있는 구역과 두번째 슬라이드로 스크롤하기 */\nfullpage_api.moveTo('firstSlide', 2);\n\n```\n\n```javascript\n//웹사이트의 세번째 구역으로 스크롤하기\nfullpage_api.moveTo(3, 0);\n\n//이는 다음과 동일\nfullpage_api.moveTo(3);\n```\n---\n### silentMoveTo(구역, 슬라이드)\n[데모](https://codepen.io/alvarotrigo/pen/doqOeY)\n[`moveTo`](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#moveto%EA%B5%AC%EC%97%AD-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C)와 완전히 동일하지만, 이 경우에는 애니메이션 없이 스크롤 기능을 수행합니다. 목적지로 바로 건너뜁니다.\n```javascript\n/*`firstSlide` 앵커 링크가 있는 구역과 두번째 슬라이드로 스크롤하기 */\nfullpage_api.silentMoveTo('firstSlide', 2);\n```\n---\n### moveSlideRight()\n[데모](https://codepen.io/alvarotrigo/pen/Wvgoyz)\n현 구역의 수평 슬라이더를 다음 슬라이드로 스크롤합니다.\n```javascript\nfullpage_api.moveSlideRight();\n```\n---\n### moveSlideLeft()\n[데모](https://codepen.io/alvarotrigo/pen/gpdLjW)\n현 구역의 수평 슬라이더를 이전 슬라이드로 스크롤합니다.\n```javascript\nfullpage_api.moveSlideLeft();\n```\n---\n### setAutoScrolling(불리언)\n[데모](https://codepen.io/alvarotrigo/pen/rVZWrR) 스크롤 환경설정을 실시간으로 설정합니다. 페이지의 스크롤 행위 방식을 정의합니다. `true`로 설정되면 \"자동\" 스크롤을 쓰고, 이외의 경우에는 웹사이트의 \"수동\"이나 \"정상\" 스크롤을 씁니다.\n\n```javascript\nfullpage_api.setAutoScrolling(false);\n```\n---\n### setFitToSection(불리언)\n[데모](https://codepen.io/alvarotrigo/pen/GJXNYm) `fitToSection` 옵션값을 설정하여 구역을 화면 안에 맞출지 여부를 정합니다.\n\n```javascript\nfullpage_api.setFitToSection(false);\n```\n---\n### fitToSection()\n[데모](https://codepen.io/alvarotrigo/pen/JWWagj) 가장 가까운 활성화된 구역으로 스크롤하여 구역을 모바일 지원(viewport)에 맞춥니다.\n\n```javascript\nfullpage_api.fitToSection();\n```\n---\n### setLockAnchors(불리언)\n[데모](https://codepen.io/alvarotrigo/pen/yNxVRQ)\n`lockAnchors` 옵션값을 설정하여 앵커가 URL 안에서 효과를 낼지 여부를 설정합니다.\n\n```javascript\nfullpage_api.setLockAnchors(false);\n```\n---\n### setAllowScrolling(불리언, [방향])\n[데모](https://codepen.io/alvarotrigo/pen/EjeNdq) 마우스 휠/트랙패드나 터치 제스처(기본 설정으로 활성화됨)로 구역/슬라이드를 통과하는 스크롤 가능성을 넣거나 없앱니다. `setKeyboardScrolling`을 쓰셔야 합니다.\n\n- `directions`: (선택 가능한 매개변수) 인정되는 값: `all`, `up`, `down`, `left`, `right` 또는 이들을 조합하되 `down, right`처럼 쉼표로 분리. 스크롤이 활성화되거나 비활성화될 방향을 정의합니다.\n\n```javascript\n\n//스크롤 비활성화\nfullpage_api.setAllowScrolling(false);\n\n//아래 방향 스크롤 비활성화\nfullpage_api.setAllowScrolling(false, 'down');\n\n//아래 및 오른쪽 방향 스크롤 비활성화\nfullpage_api.setAllowScrolling(false, 'down, right');\n```\n---\n### setKeyboardScrolling(불리언, [방향])\n[데모](https://codepen.io/alvarotrigo/pen/GJXNwm) 키보드(기본 설정으로 활성화됨)로 구역을 통과하는 스크롤 가능성을 넣거나 없앱니다.\n\n- `directions`: (선택 가능한 매개변수) 인정되는 값: `all`, `up`, `down`, `left`, `right` 또는 이들을 조합하되 `down, right`처럼 쉼표로 분리. 스크롤이 활성화되거나 비활성화될 방향을 정의합니다.\n\n```javascript\n//모든 키보드 스크롤 비활성화\nfullpage_api.setKeyboardScrolling(false);\n\n//키보드 아래 방향 스크롤 비활성화\nfullpage_api.setKeyboardScrolling(false, 'down');\n\n//키보드 아래 및 오른쪽 방향 스크롤 비활성화\nfullpage_api.setKeyboardScrolling(false, 'down, right');\n```\n---\n### setRecordHistory(불리언)\n[데모](https://codepen.io/alvarotrigo/pen/rVZWQb) URL의 각 해쉬 변경 기록을 기록할지 여부를 정의합니다.\n\n```javascript\nfullpage_api.setRecordHistory(false);\n```\n---\n### setScrollingSpeed(1000분의 1초)\n[데모](https://codepen.io/alvarotrigo/pen/NqLbeY) 스크롤 속도를 1000분의 1초 단위로 정의합니다.\n\n```javascript\nfullpage_api.setScrollingSpeed(700);\n```\n---\n### destroy(종류)\n[데모](https://codepen.io/alvarotrigo/pen/bdxBzv) 플러그인 사건(이벤트)을 없애며, 원하신다면 HTML 교정(마크업) 및 스타일도 제거할 수 있습니다. HTML 교정(마크업) 및 스타일 제거가 선택 가능합니다.\nAJAX로 컨텐츠를 불러오실 때 적합합니다.\n\n- `type`: (선택 가능한 매개변수) 비울 수 있거나 `all`이 가능합니다. `all`을 쓰면 fullpage.js가 쓰는 HTML 교정(마크업) 및 스타일이 제거됩니다. 이렇게 하면 모든 플러그인 수정 전 쓰였던 원래 HTML 교정(마크업) 및 스타일이 유지됩니다.\n\n```javascript\n//fullPage.js가 만드는 모든 자바스크립트 사건(스크롤, URL의 해쉬 변경 등 이벤트)을 제거...)\nfullpage_api.destroy();\n\n//귀하의 HTML 교정(마크업) 원본에 추가된 모든 자바스크립트 사건(이벤트)과 모든 fullPage.js 수정을 제거.\nfullpage_api.destroy('all');\n```\n---\n### reBuild()\nDOM 구조가 새로운 창 크기나 컨텐츠에 맞도록 업데이트됩니다.\n 특히 `scrollOverflow:true`를 쓰실 때 AJAX 콜이나 웹사이트의 DOM 구조 안에서 외부 변화와 함께 쓰시면 적합합니다.\n\n```javascript\nfullpage_api.reBuild();\n```\n---\n### setResponsive(불리언)\n[데모](https://codepen.io/alvarotrigo/pen/WxOyLA) 페이지의 반응형 모드를 설정합니다. `true`로 설정되면 autoScrolling이 꺼지고 `responsiveWidth`나 `responsiveHeight` 옵션이 실행될 때와 완전히 동일한 결과가 나옵니다.\n```javascript\nfullpage_api.setResponsive(true);\n```\n---\n### responsiveSlides.toSections()\n[fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/). fullpage.js 버전이 3.0.1 이상이어야 합니다.\n수평 슬라이드를 수직 구역으로 바꿉니다.\n\n```javascript\nfullpage_api.responsiveSlides.toSections();\n```\n---\n### responsiveSlides.toSlides()\n[fullpage.js 확장 프로그램](https://alvarotrigo.com/fullPage/extensions/). fullpage.js 버전이 3.0.1 이상이어야 합니다.\n(수직 구역으로 전환된) 슬라이드를 다시 수평 슬라이드로 되돌립니다.\n\n```javascript\nfullpage_api.responsiveSlides.toSlides();\n```\n\n## 콜백\n[데모](https://codepen.io/alvarotrigo/pen/XbPNQv) [여기](https://alvarotrigo.com/fullPage/examples/callbacks.html)서 어떻게 작동되는지 보실 수 있습니다.\n\n`onLeave` 등 일부 콜백에는 `Section` 또는 `Slide` 종류의 매개 변수가 들어갑니다. 이들 객체에는 다음 특성이 들어갑니다.\n- `anchor`: *(String)* 아이템의 앵커링크.\n- `index`: *(Number)* 아이템의 색인.\n- `item`: *(DOM element)* 아이템 요소.\n- `isFirst`: *(Boolean)* 아이템이 첫 번째 자식인지를 결정합니다.\n- `isLast`: *(Boolean)* 아이템이 마지막 자식인지를 결정합니다.\n\n### afterLoad (`origin`, `destination`, `direction`, `trigger`)\n구역을 불러오고 나서 스크롤이 끝나면 콜백이 실행됩니다.\n매개 변수:\n\n- `origin`: *(Object)* 활성화된 구역\n- `destination`: *(Object)* 목적지 구역.\n- `direction`: *(String)* 스크롤하는 방향에 따라 `up` 또는 `down`\n\n예시:\n\n```javascript\nnew fullpage('#fullpage', {\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\n\n\tafterLoad: function(origin, destination, direction, trigger){\n\t\tvar origin = this;\n\n\t\t//색인 사용\n\t\tif(origin.index == 2){\n\t\t\talert(\"Section 3 ended loading\");\n\t\t}\n\n\t\t//앵커링크 사용\n\t\tif(origin.anchor == 'secondSlide'){\n\t\t\talert(\"Section 2 ended loading\");\n\t\t}\n\t}\n});\n```\n---\n### onLeave (`origin`, `destination`, `direction`, `trigger`)\n사용자가 구역을 떠나고 새로운 구역으로 이동하는 와중에 콜백이 실행됩니다.\n`false`로 되돌리면 발동하기 전에 취소됩니다.\n\n매개 변수:\n\n- `origin`:  *(Object)* 출발 구역.\n- `destination`: *(Object)* 목적지 구역.\n- `direction`: *(String)* 스크롤하는 방향에 따라 `up` 또는 `down`\n\n예시:\n\n```javascript\nnew fullpage('#fullpage', {\n\tonLeave: function(origin, destination, direction, trigger){\n\t\tvar origin = this;\n\n\t\t//구역 2를 떠난 후\n\t\tif(origin.index == 1 && direction =='down'){\n\t\t\talert(\"Going to section 3!\");\n\t\t}\n\n\t\telse if(origin.index == 1 && direction == 'up'){\n\t\t\talert(\"Going to section 1!\");\n\t\t}\n\t}\n});\n```\n\n---\n### beforeLeave (`origin`, `destination`, `direction`, `trigger`)\n[데모](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback is fired right **before** leaving the section, just before the transition takes place.\n\nYou can use this callback to prevent and cancel the scroll before it takes place by returning `false`.\n\nParameters:\n\n- `origin`:  *(Object)* section of origin.\n- `destination`: *(Object)* destination section.\n- `direction`: *(String)* it will take the values `up` or `down` depending on the scrolling direction.\n- `trigger`: *(String)* indicates what triggered the scroll. It can be: \"wheel\", \"keydown\", \"menu\", \"slideArrow\", \"verticalNav\", \"horizontalNav\".\n\nExample:\n\n```javascript\n\nvar cont = 0;\nnew fullpage('#fullpage', {\n\tbeforeLeave: function(origin, destination, direction, trigger){\n\n\t\t// prevents scroll until we scroll 4 times\n\t\tcont++;\n\t\treturn cont === 4;\n\t}\n});\n```\n---\n### afterRender()\n[데모](https://codepen.io/alvarotrigo/pen/XbPNQv) 페이지 구조가 생성된 직후에 이 콜백이 실행됩니다. (이 플러그인이 DOM을 수정해서 결과 구조를 만들기 때문에) 다른 플러그인을 초기 설정하거나 문서(document)가 있어야 준비되는 모든 코드를 실행하고자 할 때 이 콜백을 쓰시면 됩니다. 더 자세한 정보를 원하신다면 [자주 묻는 질문(FAQ)](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions)을 참조해 주세요.\n\n예시:\n\n```javascript\nnew fullpage('#fullpage', {\n\tafterRender: function(){\n\t\tvar pluginContainer = this;\n\t\talert(\"The resulting DOM structure is ready\");\n\t}\n});\n```\n---\n### afterResize(`width`, `height`)\n[데모](https://codepen.io/alvarotrigo/pen/XbPNQv) 브라우저 창의 크기가 바뀐 뒤에 이 콜백이 실행됩니다. 구역 크기가 바뀐 직후에 실행됩니다.\n\n매개 변수:\n\n- `width`:  *(Number)* 창의 너비.\n- `height`: *(Number)* 창의 폭.\n\n예시:\n\n```javascript\nnew fullpage('#fullpage', {\n\tafterResize: function(width, height){\n\t\tvar pluginContainer = this;\n\t\talert(\"The sections have finished resizing\");\n\t}\n});\n```\n---\n### afterReBuild()\n[데모](https://codepen.io/alvarotrigo/pen/XbPNQv) 이 콜백은 `fullpage_api.reBuild()`를 호출하여 fullpage.js를 수동으로 다시 빌드한 후에 실행됩니다.\n\n예시:\n\n```javascript\nnew fullpage('#fullpage', {\n\tafterReBuild: function(){\n\t\tconsole.log(\"fullPage.js has manually being re-builded\");\n\t}\n});\n```\n---\n### afterResponsive(`isResponsive`)\n[데모](https://codepen.io/alvarotrigo/pen/XbPNQv) fullpage.js가 정상 모드에서 반응형 모드로 바뀌거나 반응형 모드에서 정상 모드로 바뀌고 나면 이 콜백이 실행됩니다.\n\n매개 변수:\n\n- `isResponsive`: 반응형 모드(`true`)로 들어가거나 정상 모드(`false`)로 되돌아갈지를 결정하는 불리언\n\n예시:\n\n```javascript\nnew fullpage('#fullpage', {\n\tafterResponsive: function(isResponsive){\n\t\talert(\"Is responsive: \" + isResponsive);\n\t}\n});\n```\n---\n### afterSlideLoad (`section`, `origin`, `destination`, `direction`, `trigger`)\n[데모](https://codepen.io/alvarotrigo/pen/XbPNQv) 구역의 슬라이드를 불러오고 나서 스크롤이 끝나면 콜백이 실행됩니다.\n매개 변수:\n\n- `section`: *(Object)* 활성화된 수직 구역.\n- `origin`: *(Object)* 출발 수평 슬라이드.\n- `destination`: *(Object)* 도착 수평 슬라이드.\n- `direction`: *(String)* 스크롤 방향에 따라 `right` 또는 `left`.\n\n예시:\n\n```javascript\nnew fullpage('#fullpage', {\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\n\n\tafterSlideLoad: function( section, origin, destination, direction, trigger){\n\t\tvar loadedSlide = this;\n\n\t\t//두번째 구역의 첫번째 슬라이드\n\t\tif(section.anchor == 'secondPage' && destination == 1){\n\t\t\talert(\"First slide loaded\");\n\t\t}\n\n\t\t//두번째 구역의 두번째 슬라이드\n        //(#secondSlide가 두번째 슬라이드의 앵커라고 가정할 때)\n\t\tif(section.index == 1 && destination.anchor == 'secondSlide'){\n\t\t\talert(\"Second slide loaded\");\n\t\t}\n\t}\n});\n```\n\n\n---\n### onSlideLeave (`section`, `origin`, `destination`, `direction`, `trigger`)\n[데모](https://codepen.io/alvarotrigo/pen/XbPNQv) 사용자가 슬라이드를 떠나서 다른 슬라이드로 이동하는 와중에 콜백이 실행됩니다.\n`false`로 되돌리면 발동하기 전에 취소됩니다.\n\n매개 변수:\n\n- `section`: *(Object)* 활성화된 수직 구역.\n- `origin`: *(Object)* 출발 수평 슬라이드.\n- `destination`: *(Object)* 도착 수평 슬라이드.\n- `direction`: *(String)* 스크롤 방향에 따라 `right` 또는 `left`.\n\n\n예시:\n\n```javascript\nnew fullpage('#fullpage', {\n\tonSlideLeave: function( section, origin, destination, direction, trigger){\n\t\tvar leavingSlide = this;\n\n\t\t//두번째 구역의 첫번째 슬라이드를 떠나서 오른쪽으로 이동\n\t\tif(section.index == 1 && origin.index == 0 && direction == 'right'){\n\t\t\talert(\"Leaving the fist slide!!\");\n\t\t}\n\n\t\t//두번째 구역의 세번째 슬라이드를 떠나서 왼쪽으로 이동\n\t\tif(section.index == 1 && origin.index == 2 && direction == 'left'){\n\t\t\talert(\"Going to slide 2! \");\n\t\t}\n\t}\n});\n```\n\n#### 실행되기 전에 이동 취소\n`onSlideLeave` 콜백에서 `false`로 되돌려서 취소하실 수 있습니다. [`onLeave` 취소와 동일합니다](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#%EC%8A%A4%ED%81%AC%EB%A1%A4%EC%9D%84-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0-%EC%A0%84-%EC%B7%A8%EC%86%8C).\n\n\n---\n### onScrollOverflow (`section`, `slide`, `position`, `direction`)\n[데모](https://codepen.io/alvarotrigo/pen/XbPNQv) 이 콜백은 fullPage.js의 `scrollOverflow: true` 옵션을 사용하여 스크롤 가능한 구역 내부에서 스크롤이 발생할 때 실행됩니다.\n\n매개 변수:\n\n- `section`: *(Object)* 활성화된 수직 구역.\n- `slide`: *(Object)* 출발 수평 슬라이드.\n- `position`: *(Integer)* section/slide 내에서 스크롤된 범위. 0에서 시작.\n- `direction`: *(String)* `up` 또는 `down`\n\n예시:\n\n```javascript\nnew fullpage('#fullpage', {\n\tonScrollOverflow: function( section, slide, position, direction){\n\t\tconsole.log(section);\n\t\tconsole.log(\"position: \" + position);\n\t}\n});\n```\n\n# 문제 알리기\n1. 문의하시기 이전에 먼저 github 검색으로 찾아보시기 바랍니다.\n2. fullpage.js 최신 버전을 쓰시기 바랍니다. 이전 버전은 지원해 드리지 않습니다.\n3. [Github 문제 포럼](https://github.com/alvarotrigo/fullPage.js/issues)을 활용해 보세요.\n4. **문제만 따로 떼어내어 재현해야 합니다.** 가능하다면 [jsfiddle](https://jsfiddle.net/alvarotrigo/ea17skjr/)이나 [codepen](https://codepen.io/alvarotrigo/pen/qqabrp)을 활용하시기 바랍니다.\n\n# fullpage.js에 기여하기\n[fullpage.js에 기여하기](https://github.com/alvarotrigo/fullPage.js/wiki/Contributing-to-fullpage.js)를 방문해 주세요.\n\n# 수정 일지\n최근 수정 사항 목록을 보시려면 [수정 내역](https://github.com/alvarotrigo/fullPage.js/releases)을 참조해 주세요.\n\n# 구축 도전\nfullpage.js 배포 파일을 구축하고 싶으신가요? [구축 도전](https://github.com/alvarotrigo/fullPage.js/wiki/Build-tasks)을 방문해 주세요.\n\n# 재료가 되는 도구\n- Wordpress Plugin [for Gutenberg](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/) and [for Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/).\n- [워드프레스 테마](https://alvarotrigo.com/fullPage/utils/wordpress.html)\n- [Official Vue.js wrapper component](https://github.com/alvarotrigo/vue-fullpage.js)\n- [Official React.js wrapper component](https://github.com/alvarotrigo/react-fullpage)\n- [Official Angular wrapper component](https://github.com/alvarotrigo/angular-fullpage)\n- [CSS Easing Animation Tool - Matthew Lein](https://matthewlein.com/ceaser/) (`easingcss3` 값을 정의하는 데 유용)\n- [fullPage.js jsDelivr CDN](https://www.jsdelivr.com/package/npm/fullpage.js)\n- [fullPage.js October CMS 플러그인](https://github.com/freestream/oc-parallax-plugin)\n- [fullPage.js Angular2 directive](https://github.com/meiblorn/ng2-fullpage)\n- [fullPage.js angular directive](https://github.com/hellsan631/angular-fullpage.js)\n- [fullPage.js ember-cli 애드온](https://www.npmjs.com/package/ember-cli-fullpagejs)\n- [fullPage.js Rails Ruby Gem](https://rubygems.org/gems/fullpagejs-rails)\n- [각진 fullPage.js - Angular.js v1.x 맞춤형](https://github.com/mmautomatizacion/angular-fullpage.js)\n- [fullPage.js를 워드프레스와 통합하기 (튜토리얼)](https://premium.wpmudev.org/blog/build-apple-inspired-full-page-scrolling-pages-for-your-wordpress-site/)\n\n## 누가 fullPage.js를 쓰나요?\n\n![Who is using fullPage.js](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/using-fullpage.png)\n\n- http://www.bbc.co.uk/news/resources/idt-d88680d1-26f2-4863-be95-83298fd01e02\n- http://medoff.ua/en/\n- http://promo.prestigio.com/grace1/\n- http://torchbrowser.com/\n- http://www.boxreload.com/\n- http://boxx.hk/\n- http://www.villareginateodolinda.it\n\n## Sponsors\n스폰서가 되어 GitHub README에 귀하의 로고와 사이트 링크를 추가하세요。[[문의하기](https://alvarotrigo.com/#contact)] | [[Patreon이 되기]](https://www.patreon.com/fullpagejs) | [GitHub 스폰서가 되기](https://github.com/sponsors/alvarotrigo)\n\n\n[![Warp](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/warp.png)](http://go.warp.dev/fullPage)\n[![Crawlbase](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/crawlbase.png)](https://crawlbase.com/?utm_source=github&utm_medium=sponsor&utm_campaign=fullpagejs)\t\n[![TestMu](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/testmu-ai.png)](https://www.testmu.com/?utm_source=fullpagejs&utm_medium=sponsor)\n[![Codeless](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codeless.png)](https://codeless.co)\n[![Stackpath](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/stackpath3.png)](https://www.stackpath.com/)\n[![Browserstack](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/browserstack3.png)](http://www.browserstack.com/)\n[![CodePen](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codepen3.png)](https://codepen.com)\n\n### People\n<a href=\"https://github.com/donsalvadori\" target=\"_blank\" rel=\"nofollow\">\n\t<img src=\"http://wallpapers-for-ipad.com/fullpage/imgs3/avatars/donsalvadori.jpg\">\n</a>\n\n## Contributors\n\n<a href=\"https://github.com/alvarotrigo/fullPage.js/graphs/contributors\">\n  <img src=\"https://contrib.rocks/image?repo=alvarotrigo/fullPage.js&max=400&columns=25&anon=1&v=2\" />\n</a>\n\n"
  },
  {
    "path": "lang/korean/how-to-activate-fullpage-extension.md",
    "content": "# fullPage.js 확장 프로그램을 활성화하는 법\n\n1. 확장 프로그램을 구매하셨을 때 이메일로 전송된 [URL](https://alvarotrigo.com/fullPage/extensions/activationKey.html)에 접속하세요. (https://alvarotrigo.com/fullPage/extensions/activationKey.html)\n1. 아이템 구매시 받으신 라이센스 키를 창에 입력하세요. 구매 확인 이메일에도 있습니다.\n1. 귀하의 제품 활성화 키를 획득하시려면 도메인 이름이 추가로 필요할 수 있습니다.\n1. `nameOfExtension + \"Key\": key`: 양식으로 fullpage.js 초기 설정에 있는 옵션을 추가해서 특정 확장 프로그램용 활성화 키를 추가하세요.\n\n예시:\n\n```javascript\nvar myFullpage = new fullpage('#fullpage', {\n    fadingEffect: true,\n    fadingEffectKey: '활성화 키가 여기에 위치해야 합니다',\n});\n```\n\n나머지 확장 프로그램을 쓰실 때도 마찬가지입니다. 현재 나와 있는 모든 확장 키 옵션이 아래에 열거되어 있습니다:\n\n* `fadingEffectKey`\n* `responsiveSlidesKey`\n* `continuousHorizontalKey`\n* `interlockedSlidesKey`\n* `scrollHorizontallyKey`\n* `resetSlidersKey`\n* `offsetSectionsKey`\n* `dragAndMoveKey`\n* `parallaxKey`\n* `cardsKey`\n\n[확장 프로그램 사용](https://github.com/alvarotrigo/fullPage.js#use-extensions)에서도 설명드렸듯이 확장 프로그램을 쓰시려면 보통 쓰는 fullPage.js(`fullpage.js`) 파일 대신 꼭 [`fullpage.extensions.min.js`](https://github.com/alvarotrigo/fullPage.js/blob/master/dist/fullpage.extensions.min.js)를 쓰셔야 한다는 걸 염두해 주세요.\n\n\n### What to do for development environments / websites?\nNo activation key is necessary for localhost and 127.0.0.1. Any other staging domains will require a license (Professional or Business) that allows to generate a new key for those.\n\nIf you have a license that allows you to generate multiple activation keys you might want to use the same JS code for all of them. In this case you can use an array with the different keys for each domain, for example, if we are using the `scrollHorizontally` extension for 3 domains, we can do the following:\n\n```js\nnew fullPage('#fullpage', {\n    scrollHorizontally: true,\n    scrollHorizontallyKey: ['domain1_key', 'domain2_key', 'domain3_key'] \n});\n```\n\nThis way the extension can be used in any of those 3 domains.\n\n"
  },
  {
    "path": "lang/korean/parallax-extension.md",
    "content": "# 패럴랙스 확장 프로그램\n\n![](https://cloud.githubusercontent.com/assets/1706326/23580315/f28edab4-00f6-11e7-90f9-81ffafd77b0e.gif)\n\n패럴랙스 옵션을 쓰시기 전에 [확장 프로그램 사용](https://github.com/alvarotrigo/fullPage.js/tree/dev/lang/korean#%ED%99%95%EC%9E%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%82%AC%EC%9A%A9)을 읽어보세요.\n- [실시간 데모](http://alvarotrigo.com/fullPage/extensions/parallax.html)\n- [필요한 HTML 구조](#%ED%95%84%EC%9A%94%ED%95%9C-html-%EA%B5%AC%EC%A1%B0)\n- [배경 적용](#%EB%B0%B0%EA%B2%BD-%EC%A0%81%EC%9A%A9)\n- [옵션](#%EC%98%B5%EC%85%98)\n  - [패럴랙스 효과 옵션](#%ED%8C%A8%EB%9F%B4%EB%9E%99%EC%8A%A4-%ED%9A%A8%EA%B3%BC-%EC%98%B5%EC%85%98)\n- [방법](#%EB%B0%A9%EB%B2%95)\n\n## 필요한 HTML 구조\n구역 및 슬라이드에서 패럴랙스 효과를 쓰시려면 새로운 요소를 `fp-bg` 클래스와 함께 추가하셔야 합니다. 빈 `div`를 구역 또는 슬라이드의 첫 번째 자식 요소로 배치하셔야 하는 것입니다. 아래에 예시가 나와 있습니다.\n\n```html\n<div class=\"fp-bg\"></div>\n```\n\n구역이나 슬라이드 말고 이 요소에다 배경을 적용하셔야 합니다.\n\n예시:\n```html\n<div id=\"fullpage\">\n    <div class=\"section\" id=\"section1\">\n        <div class=\"fp-bg\"></div>\n        Slide 1.1\n    </div>\n    <div class=\"section\" id=\"section2\">\n        <div class=\"slide\" id=\"slide2-1\">\n            <div class=\"fp-bg\"></div>\n            Slide 2.1\n        </div>\n        <div class=\"slide\" id=\"slide2-2\">\n            <div class=\"fp-bg\"></div>\n            Slide 2.2\n        </div>\n    </div>\n</div>\n```\n\n[패럴랙스 데모 페이지](http://alvarotrigo.com/fullPage/extensions/parallax.html)의 소스 코드에서 이 구조를 보실 수 있습니다.\n\n> 레이아웃에 새 요소를 추가하고 싶지 않으시다면 `parallaxOptions` 안에 있는 `property` 옵션을 `background`로 설정하시면 현 구역 또는 슬라이드 배경에 효과가 적용됩니다.\n> 패럴랙스 효과 옵션에서 설명드리듯이 이렇게 하실 경우 `fp-bg` 요소를 쓰는 것만큼 잘 돌아가지 않기 때문에 꼭 필요한 경우에만 쓰실 것을 추천드립니다.\n\n<br>\n\n## 배경 적용\n배경이 구역이나 슬라이드에 적용될 때와 마찬가지 방식으로 `fp-bg` 요소에 적용되어야 합니다.\nCSS나 인라인 스타일을 쓰실 수 있습니다.\n\n예시:\n```css\n#section1 .fp-bg{\n    background-image: url('imgs/alvaro-genious.jpg');\n    background-size: cover;\n    background-position: center 80%;\n}\n```\n## 옵션\n\n| 옵션  | 설명 |\n| ------------- | ------------- |\n| **parallax**  | (표준값 `false`). [fullPage.js의 확장](http://alvarotrigo.com/fullPage/extensions/). 구역 / 슬라이드에 패럴랙스 배경 효과를 쓸지 말지 여부를 정의합니다. Possible values are false, true, sections, slides. |\n| **parallaxOptions:**   | (표준값: `{ type: 'reveal', percentage: 62, property: 'translate'}`). `parallax:true` 옵션을 쓸 때 패럴랙스 배경 효과 매개 변수를 설정할 수 있습니다.  |\n<br>\n\n### 패럴랙스 효과 옵션\n\n[데모 페이지](http://alvarotrigo.com/fullPage/extensions/parallax.html)에서 어떻게 작동하는지 효과를 보실 수 있습니다.\n\n`parallaxOptions`에서 환경 설정 가능한 옵션의 설명을 보실 수 있습니다.\n\n| parallaxOptions  |설명 |\n| ------------- | ------------- |\n| **type**  | (표준값 `reveal`) `cover`와 `reveal` 값이 가능합니다. 현 구역/슬라이드가 도착하는 구역/슬라이드 위에 가도록 할지 아니면 아래에 가도록 할지 선택하는 방법입니다. `cover`를 쓰면 다음 구역 또는 슬라이드가 현재 구역 또는 슬라이드의 일부를 가립니다. `reveal`을 쓰면 이와 반대로 도착하는 구역/슬라이드의 일부가 가려지고 나머지는 드러나게 됩니다.  |\n| **percentage**  | (표준값 62 ) 뷰포트(viewport) 대비 패럴랙스 효과 퍼센트를 정의할 수 있습니다. 값이 작으면 패럴랙스 효과가 작아지고, 최고값 100을 넣으면 배경이 완전히 정지합니다.   |\n| **property** | 패럴랙스 효과를 `fp-bg` 요소에 적용하고 싶은지, 아니면 구역 또는 슬라이드의 배경 속성에 바로 적용하고 싶은지를 정의합니다. 이 옵션에는 표준값을 쓰실 것을 권장합니다.|\n\n`fp-bg` 요소를 쓰면 translate3d 하드웨어 가속을 활용하기 때문에 훨씬 더 잘 돌아간다는 점을 기억해 주세요. 각 구역이나 슬라이드마다 일일이 `fp-bg` 요소를 추가로 넣고 싶지 않거나 HTML 교정을 수정할 수 없는 경우를 위한 옵션입니다.\n\n## 방법\n[데모페이지](http://alvarotrigo.com/fullPage/extensions/parallax.html)에서 어떻게 작동하는지 효과를 보실 수 있습니다.\n\n### setOption(옵션이름, 값)\n주어진 옵션의 값을 설정합니다. `옵션이름`은 `옵션이름` 에서 쓸 수 있는 어느 옵션이든 가능합니다. (`type`, `percentage` 또는 `property`).\n```javascript\n//`종류` 속성값 바꾸기\nfullpage_api.parallax.setOption('type', 'cover');\n\n//`퍼센트` 속성값 바꾸기\nfullpage_api.parallax.setOption('percentage', '30');\n```\n---\n\n### init()\n패럴랙스 효과를 활성화합니다. 패럴랙스 효과를 특정 지점에서 역동적으로 활성화해야 할 때 유용합니다.\n```javascript\nfullpage_api.parallax.init();\n```\n---\n### destroy()\n패럴랙스 효과를 끕니다.\n```javascript\nfullpage_api.parallax.destroy();\n```\n\n\n"
  },
  {
    "path": "lang/russian/README.md",
    "content": "# fullPage.js\r\n![предварительный просмотр](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/intro.png)\r\n![совместимость](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/compatible.png)\r\n\r\n<p align=\"center\">\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/#fullpagejs\">English</a> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish#fullpagejs\">Español</a> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#fullpagejs\">Français</a> |\r\n  <span>Pусский</span> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese#fullpagejs\">中文</a> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#fullpagejs\">한국어</a> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese#fullpagejs\"> 日本語</a> | \r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese#fullpagejs\">Português Brasileiro</a>\r\n</p>\r\n\r\n<p align=\"center\">\r\n\tДоступно для <a href=\"https://github.com/alvarotrigo/vue-fullpage.js\">Vue</a>, <a href=\"https://github.com/alvarotrigo/react-fullpage\">React</a> и <a href=\"https://github.com/alvarotrigo/angular-fullpage\">Angular</a>.\r\n</p>\r\n\r\n---\r\n\r\n![Версия fullPage.js](https://img.shields.io/badge/fullPage.js-v4.0.41-brightgreen.svg)\r\n[![Лицензия](https://img.shields.io/badge/License-GPL-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.html)\r\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/fullpage.js/badge?style=rounded)](https://www.jsdelivr.com/package/npm/fullpage.js)\r\n[![Minzipped Size](https://img.shields.io/bundlephobia/minzip/fullpage.js)](https://bundlephobia.com/package/fullpage.js)\r\n&nbsp;&nbsp;**|**&nbsp;&nbsp; *Created by [@imac2](https://twitter.com/imac2)*\r\n\r\n- [Живое демо](https://alvarotrigo.com/fullPage/) | [Codepen](https://codepen.io/alvarotrigo/pen/NxyPPp)\r\n- [Wordpress plugin for Gutenberg](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/) and [WordPress pluging fo Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/)\r\n- [Тема Wordpress](https://alvarotrigo.com/fullPage/utils/wordpress.html)\r\n- [Расширения fullpage.js](https://alvarotrigo.com/fullPage/extensions/)\r\n- [Часто задаваемые вопросы](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions)\r\n- [[Migration from fullPage v3 to fullpage v4]](https://alvarotrigo.com/fullPage/help/migration-from-fullpage-3/)\r\n---\r\n\r\nПростая и удобная в использовании библиотека для создания веб-сайтов с полноэкранной прокруткой (также известных, как одностраничные сайты).\r\nОна позволяет создавать веб-сайты с полноэкранной прокруткой, а также добавлять горизонтальные ползунки для разделов сайта.\r\n\r\n- [Введение](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Введение)\r\n- [Совместимость](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Совместимость)\r\n- [Лицензия](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Лицензия)\r\n- [Использование](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Использование)\r\n  - [Создание ссылок на разделы или слайды](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Создание-ссылок-на-разделы-или-слайды)\r\n  - [Создание больших и малых разделов](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Создание-больших-и-малых-разделов)\r\n  - [Классы состояний, добавляемые fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Классы-состояний-добавляемые-fullpagejs)\r\n  - [Отложенная загрузка](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Отложенная-загрузка)\r\n  - [Автопроигрывание встроенного медиа](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Автопроигрываниеприостановка-встроенного-медиа)\r\n  - [Использование расширений](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Использование-расширений)\r\n- [Опции](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Опции)\r\n- [Функции](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Функции)\r\n- [Обратные вызовы](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Обратные-вызовы)\r\n- [Сообщение о проблеме](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Сообщение-о-проблемах)\r\n- [Внесение предложений для fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Внесение-предложений-для-fullpagejs)\r\n- [Change Log](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#changelog)\r\n- [Задачи по построению](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Задачи-по-построению)\r\n- [Ресурсы](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Ресурсы)\r\n- [Кто пользуется fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Кто-пользуется-fullpagejs)\r\n- [Денежные переводы](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Денежные-переводы)\r\n\r\n## Введение\r\nБолее чем приветствуются ваши предложения, касающиеся не только функций и возможностей, но и улучшения стиля кодирования.\r\nДавайте вместе создадим замечательную библиотеку, чтобы облегчить жизнь пользователям!\r\n\r\n## Совместимость\r\nfullPage.js is fully functional on all modern browsers and with IE 11. If you need to support IE < 11 consider using [fullPage.js v3](https://github.com/alvarotrigo/fullPage.js/tree/3.1.2).\r\nIt also provides touch support for mobile phones, tablets and touch screen computers.\r\n\r\nВыражаем особую благодарность [Browserstack](https://www.browserstack.com/) за поддержку fullpage.js.\r\n\r\n## Лицензия\r\n\r\n### Коммерческая лицензия\r\nЕсли вы хотите использовать fullPage для разработки коммерческих сайтов, тем, проектов и приложений, то вам подойдёт коммерческая лицензия. С такой опцией ваш исходный код будет закрытым. Это значит, что вам не придётся менять весь исходный код вашего приложения на лицензию с открытым исходным кодом. [[Приобретите Коммерческую лицензию Fullpage здесь]](https://alvarotrigo.com/fullPage/pricing/)\r\n\r\n### Лицензия с открытым исходным кодом\r\nЕсли вы создаёте приложение с открытым исходным кодом по лицензии, совместимой с [Лицензией GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html), вы можете использовать fullPage на условиях GPLv3.\r\n\r\n**You will have to provide a prominent notice that fullPage.js is in use. Сведения об авторе в JavaScript и файлах CSS должны оставаться без изменений** (даже после комбинации или минификации)\r\n\r\n[Прочесть больше о лицензии fullPage](https://alvarotrigo.com/fullPage/pricing/).\r\n\r\n## Использование\r\nКак вы можете увидеть в файлах-примерах, вам необходимо будет включить:\r\n - Файл JavaScript `fullpage.js` (или его минифицированную версию `fullpage.min.js`)\r\n - Файл css `fullpage.css`\r\n\r\n **Опционально**, при использовании `css3:false` вы можете добавить [библиотеку jQuery UI](https://jqueryui.com/), в случае если вы хотите использовать другие анимационные эффекты, в дополнение к включённым в библиотеку (`easeInOutCubic` ).\r\n\r\n### Установка bower или npm\r\n**Опционально**, вы можете установить fullPage.js с bower или npm согласно вашим предпочтениям:\r\n\r\nВведите:\r\n```shell\r\n// С bower\r\nbower install fullpage.js\r\n\r\n// С npm\r\nnpm install fullpage.js\r\n```\r\n\r\n### Включение файлов:\r\n```html\r\n<link rel=\"stylesheet\" type=\"text/css\" href=\"fullpage.css\" />\r\n\r\n\r\n<!-- Следующая строчка опциональна. Необходима лишь в случае, если вы используете опцию css3:false и хотите использовать другие анимационные эффекты, кроме \"linear\", \"swing\" или \"easeInOutCubic\". -->\r\n<script src=\"vendors/easings.min.js\"></script>\r\n\r\n<script type=\"text/javascript\" src=\"fullpage.js\"></script>\r\n```\r\n\r\nUsing Webpack, Browserify or Require.js? Check [how to use fullPage.js with module loaders](https://github.com/alvarotrigo/fullPage.js/wiki/Use-module-loaders-for-fullPage.js).\r\n\r\n### Опциональное использование CDN\r\nЕсли вы предпочитаете использовать CDN для загрузки необходимых файлов, fullPage.js есть в [JSDelivr](https://www.jsdelivr.com/package/npm/fullpage.js), [UNPKG](https://unpkg.com/browse/fullpage.js/dist/), [CDNJS](https://cdnjs.com/libraries/fullPage.js)...\r\n\r\n### Требуемая HTML-структура\r\nНачиная свой документ HTML, обязательно введите [HTML DOCTYPE declaration](https://www.corelangs.com/html/introduction/doctype.html) в первой строке вашего HTML-кода. Иначе у вас могут возникнуть проблемы с вертикальным размером разделов. В приведённых примерах используется тип документа HTML 5 `<!DOCTYPE html>`.\r\n\r\nКаждый раздел будет определён элементом, содержащим класс `section`.\r\nАктивный раздел по умолчанию будет являться первым разделом, то есть домашней страницей.\r\n\r\nРазделы должны помещаться в обёрточный код (в данном случае - `<div id=\"fullpage\">`). Обёрточный код не может быть элементом `body`.\r\n```html\r\n<div id=\"full page\">\r\n\t<div class=\"section\">Определённый раздел</div>\r\n\t<div class=\"section\">Определённый раздел</div>\r\n\t<div class=\"section\">Определённый раздел</div>\r\n\t<div class=\"section\">Определённый раздел</div>\r\n</div>\r\n```\r\nЕсли вы хотите определить другую точку входа (не первый раздел или первый слайд раздела), просто добавьте класс `active` к разделу и слайду, которые вы хотите загружать в первую очередь.\r\n```html\r\n<div class=\"section active\">Определённый раздел</div>\r\n```\r\n\r\nЧтобы создать горизонтальный ползунок в разделе, каждый слайд должен определяться по умолчанию с помощью элемента, содержащего класс `slide`:\r\n```html\r\n<div class=\"section\">\r\n\t<div class=\"slide\"> Слайд 1 </div>\r\n\t<div class=\"slide\"> Слайд 2 </div>\r\n\t<div class=\"slide\"> Слайд 3 </div>\r\n\t<div class=\"slide\"> Слайд 4 </div>\r\n</div>\r\n````\r\nВы можете посмотреть на полностью работоспособный пример HTML-структуры здесь: [файл `simple.html`](https://github.com/alvarotrigo/fullPage.js/blob/master/examples/simple.html).\r\n\r\n### Инициализация\r\n\r\n#### Инициализация с Vanilla Javascript\r\nВсё, что вам нужно сделать, - это указать fullPage.js перед закрывающим тегом `</body>`.\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\t//options here\r\n\tautoScrolling:true,\r\n\tscrollHorizontally: true\r\n});\r\n```\r\n\r\n#### Инициализация с jQuery\r\nЕсли хотите, можете также использовать fullpage.js в качестве плагина jQuery!\r\n\r\n```javascript\r\n$(document).ready(function() {\r\n\t$('#fullpage').fullpage({\r\n\t\t//options here\r\n\t\tautoScrolling:true,\r\n\t\tscrollHorizontally: true\r\n\t});\r\n\r\n\t// Example of how to use fullpage.js methods\r\n\t$.fn.fullpage.setAllowScrolling(false);\r\n});\r\n```\r\n\r\n#### Пример Vanilla JS со всеми опциями\r\n\r\nБолее сложная инициализация с установкой всех параметров может выглядеть так:\r\n```javascript\r\nvar myFullpage = new fullpage('#fullpage', {\r\n\t// Навигация\r\n\tmenu: '#menu',\r\n\tlockAnchors: false,\r\n\tanchors:['firstPage', 'secondPage'],\r\n\tnavigation: false,\r\n\tnavigationPosition: 'right',\r\n\tnavigationTooltips: ['firstSlide', 'secondSlide'],\r\n\tshowActiveTooltip: false,\r\n\tslidesNavigation: false,\r\n\tslidesNavPosition: 'bottom',\r\n\r\n\t// Скроллинг\r\n\tcss3: true,\r\n\tscrollingSpeed: 700,\r\n\tautoScrolling: true,\r\n\tfitToSection: true,\r\n\tfitToSectionDelay: 600,\r\n\tscrollBar: false,\r\n\teasing: 'easeInOutCubic',\r\n\teasingcss3: 'ease',\r\n\tloopBottom: false,\r\n\tloopTop: false,\r\n\tloopHorizontal: true,\r\n\tcontinuousVertical: false,\r\n\tcontinuousHorizontal: false,\r\n\tscrollHorizontally: false,\r\n\tinterlockedSlides: false,\r\n\tdragAndMove: false,\r\n\toffsetSections: false,\r\n\tresetSliders: false,\r\n\tfadingEffect: false,\r\n\tnormalScrollElements: '#element1, .element2',\r\n\tscrollOverflow: true,\r\n\tscrollOverflowMacStyle: false,\r\n\tscrollOverflowReset: false,\r\n\ttouchSensitivity: 15,\r\n\tbigSectionsDestination: null,\r\n\tadjustOnNavChange: true,\r\n\r\n\t// Доступ\r\n\tkeyboardScrolling: true,\r\n\tanimateAnchor: true,\r\n\trecordHistory: true,\r\n\r\n\t// Дизайн\r\n\tcontrolArrows: true,\r\n\tcontrolArrowsHTML: [\r\n\t\t'<div class=\"fp-arrow\"></div>', \r\n\t\t'<div class=\"fp-arrow\"></div>'\r\n\t],\r\n\tverticalCentered: true,\r\n\tsectionsColor : ['#ccc', '#fff'],\r\n\tpaddingTop: '3em',\r\n\tpaddingBottom: '10px',\r\n\tfixedElements: '#header, .footer',\r\n\tresponsiveWidth: 0,\r\n\tresponsiveHeight: 0,\r\n\tresponsiveSlides: false,\r\n\tcinematic: false,\r\n\tcinematicOptions: [Object],\r\n\teffects: false,\r\n\teffectsOptions: [Object],\r\n\tparallax: false,\r\n\tparallaxOptions: {type: 'reveal', percentage: 62, property: 'translate'},\r\n\tdropEffect: false,\r\n\tdropEffectOptions: { speed: 2300, color: '#F82F4D', zIndex: 9999},\r\n\twaterEffect: false,\r\n\twaterEffectOptions: { animateContent: true, animateOnMouseMove: true},\r\n\tcards: false,\r\n\tcardsOptions: {perspective: 100, fadeContent: true, fadeBackground: true},\r\n\r\n\t// Настроить селекторы\r\n\tsectionSelector: '.section',\r\n\tslideSelector: '.slide',\r\n\r\n\tlazyLoading: true,\r\n\tlazyLoadThreshold: 0,\r\n\tobserver: true,\r\n\tcredits: { enabled: true, label: 'Made with fullPage.js', position: 'right'},\r\n\r\n\t// Cобытия\r\n\tbeforeLeave: function(origin, destination, direction, trigger){},\r\n\tonLeave: function(origin, destination, direction, trigger){},\r\n\tafterLoad: function(origin, destination, direction, trigger){},\r\n\tafterRender: function(){},\r\n\tafterResize: function(width, height){},\r\n\tafterReBuild: function(){},\r\n\tafterResponsive: function(isResponsive){},\r\n\tafterSlideLoad: function(section, origin, destination, direction, trigger){},\r\n\tonSlideLeave: function(section, origin, destination, direction, trigger){},\r\n\tonScrollOverflow: function(section, slide, position, direction){}\r\n});\r\n```\r\n\r\n### Создание ссылок на разделы или слайды\r\nЕсли вы используете fullPage.js с ссылками привязки для разделов (пользуясь опцией `anchors` или атрибутом `data-anchor` в каждом разделе), то вы сможете использовать ссылки привязки также для перемещения напрямую к определённому слайду в разделе.\r\n\r\nВот пример ссылки с привязкой: https://alvarotrigo.com/fullPage/#secondPage/2 (это URL, который вы увидите при доступе к данному разделу/слайду вручную)\r\nОбратите внимание на то, что последняя часть URL заканчивается элементом `#secondPage/2`.\r\n\r\nПри следующей инициализации:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors:['firstPage', 'secondPage', 'thirdPage']\r\n});\r\n```\r\n\r\nПривязка `#secondPage/2` в конце URL определяет заданный раздел и слайд соответственно. В предыдущем URL заданным разделом будет являться раздел, определённый привязкой `secondPage`, а заданным слайдом будет второй слайд, так как для этого мы и использовали индекс `2`. (первый слайд в разделе имеет индекс 0, так как технически это раздел).\r\n\r\nМы могли бы использовать свою привязку для слайда, а не его индекс, если бы мы использовали атрибут `data-anchor` в HTML-разметке следующим образом:\r\n\r\n```html\r\n<div class=\"section\">\r\n\t<div class=\"slide\" data-anchor=\"slide1\"> Слайд 1 </div>\r\n\t<div class=\"slide\" data-anchor=\"slide2\"> Слайд 2 </div>\r\n\t<div class=\"slide\" data-anchor=\"slide3\"> Слайд 3 </div>\r\n\t<div class=\"slide\" data-anchor=\"slide4\"> Слайд 4 </div>\r\n</div>\r\n```\r\nВ данном случае мы бы использовали URL `#secondPage/slide3`, являющийся эквивалентным предыдущему - `#secondPage/2`.\r\n\r\nОбратите внимание, что привязки к разделам могут создаваться точно также, с помощью атрибута `data-anchor`, если не предусмотрен ряд каких-либо привязок - `anchors`.\r\n\r\n**Внимание!** обозначения `data-anchor` не могут иметь значение, совпадающее с каким-либо элементом ID на сайте (или элементом NAME - для IE).\r\n\r\n### Создание больших и малых разделов\r\n[Демо](https://codepen.io/alvarotrigo/pen/BKjRYm) fullPage.js обеспечивает возможность убрать ограничение по высоте разделов и слайдов. Есть возможность создавать разделы, высота которых больше или меньше окна просмотра. Эта функция идеальна при использовании колонтитулов.\r\nВажно понимать, что нет смысла в применении данной функции ко всем вашим разделам. При наличии более чем одного раздела при первоначальной загрузке сайта fullPage.js не сможет сделать прокрутку, чтобы увидеть следующий раздел, так как он уже и так будет находиться в окне просмотра.\r\n\r\nДля создания меньших разделов просто используйте класс `fp-auto-height` в разделе, к которому хотите применить эту функцию. Тогда высота будет определяться контентом вашего раздела/слайда.\r\n\r\n```html\r\n<div class=\"section\">Полное окно просмотра</div>\r\n<div class=\"section fp-auto-height\">Автовысота</div>\r\n```\r\n\r\n#### Разделы с подстройкой автовысоты\r\n[Демо](https://codepen.io/alvarotrigo/pen/MzByMa) Подстройка автовысоты может быть применена с помощью класса `fp-auto-height-responsive`. В таком случае разделы будут отображаться в полную высоту, пока не будет активирован режим подстройки.\r\n\r\n### Классы состояний, добавляемые fullpage.js\r\nFullpage.js добавляет различные классы к разным элементам, чтобы отслеживать статус сайта:\r\n\r\n- `active` добавляется к текущему отображаемому разделу и слайду.\r\n- `active` добавляется к текущему элементу меню (если используется опция `menu`).\r\n- `fp-loaded` добавляется к элементу секции или слайда, который инициирует ленивую загрузку медиаконтента.\r\n- Класс вида `fp-viewing-SECTION-SLIDE` добавляется к элементу `body`. (например: [`fp-viewing-secondPage-0`](https://alvarotrigo.com/fullPage/#secondPage)) Части `SECTION` и `SLIDE` будут являться привязками (или индексами, если привязки не предусмотрены) к текущему разделу и слайду.\r\n- `fp-responsive` добавляется к элементу `body` при входе в режим подстройки\r\n- `fp-enabled` добавляется к элементу `html`, когда fullpage.js активирован. (и удаляется при деактивации).\r\n- `fp-destroyed` добавляется к хранилищу fullpage.js при деактивации fullPage.js.\r\n\r\n### Отложенная загрузка\r\n[Демо](https://codepen.io/alvarotrigo/pen/eNLBXo) fullPage.js обеспечивает возможность отложенной загрузки изображений, видео- и аудиоэлементов, чтобы они не замедляли загрузку вашего сайта и не тратили без необходимости трафик при передаче данных.\r\nПри использовании отложенной загрузки все эти элементы будут загружаться только при открытии в окне конструирования.\r\nВсё, что вам нужно сделать для активации отложенной загрузки, - это изменить ваш атрибут `src` на `data-src`, как показано ниже:\r\n\r\n```\r\n<img data-src=\"image.png\">\r\n<video>\r\n\t<source data-src=\"video.webm\" type=\"video/webm\" />\r\n\t<source data-src=\"video.mp4\" type=\"video/mp4\" />\r\n</video>\r\n ```\r\n\r\nЕсли вы уже применяете другой способ для отложенной загрузки, который также использует `data-src`, вы можете отключить отложенную загрузку fullPage.js, установив опцию `lazyLoading: false`.\r\n\r\n### Автопроигрывание/приостановка встроенного медиа\r\n\r\n[Демо](https://codepen.io/alvarotrigo/pen/pXEaaK) **Примечание**: функция автопроигрывания может не работать на некоторых мобильных устройствах, в зависимости от их ОС и браузера (то есть, в [Safari в iOS](https://webkit.org/blog/6784/new-video-policies-for-ios/), в версиях до 10.0).\r\n\r\n#### Проигрывание при загрузке раздела/слайда:\r\nПри использовании атрибута `autoplay` для видео или аудио, или параметра `autoplay=1` для встроенных фреймов youtube, медиа будет проигрываться при загрузке страницы.\r\nДля проигрывания медиа при загрузке раздела/слайда, используйте `data-autoplay`. Например:\r\n\r\n```html\r\n<audio data-autoplay>\r\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\r\n</audio>\r\n```\r\n\r\n#### Приостановка при покидании страницы\r\nВстроенные фреймы HTML5 `<video>` / `<audio>` и Youtube автоматически останавливаются, когда вы покидаете раздел или слайд. Это можно отключить с помощью атрибута `data-keepplaying`. Например:\r\n```html\r\n<audio data-keepplaying>\r\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\r\n</audio>\r\n```\r\n\r\n### Использование расширений\r\nfullpage.js [предоставляет ряд расширений](https://alvarotrigo.com/fullPage/extensions/), которые вы можете использовать для улучшения его функций, предусмотренных по умолчанию. Все они представлены как [опции fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Опции).\r\n\r\nДля расширений вам требуется использовать минифицированный файл [`fullpage.extensions.min.js`](https://github.com/alvarotrigo/fullPage.js/blob/master/dist/fullpage.extensions.min.js), находящийся в [папке `dist`](https://github.com/alvarotrigo/fullPage.js/tree/master/dist), а не обычный файл fullPage.js (`fullpage.js` или `fullpage.min.js`).\r\n\r\nПосле приобретения файла расширения вам нужно будет добавить его перед fullPage. Например, если я хочу использовать расширение Continuos Horizontal, мне нужно будет включить файл расширения, а затем – версию файла fullPage для расширений.\r\n\r\n```html\r\n<script type=\"text/javascript\" src=\"fullpage.continuousHorizontal.min.js\"></script>\r\n<script type=\"text/javascript\" src=\"fullpage/fullpage.extensions.min.js\"></script>\r\n```\r\n\r\nКлюч активации и ключ лицензии потребуются для каждого расширения. [Узнайте более подробно об этом здесь](https://github.com/alvarotrigo/fullPage.js/blob/master/lang/russian/how-to-activate-fullpage-extension.md).\r\n\r\nЗатем вы сможете использовать и настраивать их, как разъясняется в разделе [опции](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Опции).\r\n\r\n## Опции\r\n\r\n### licenseKey\r\n(по умолчанию `null`). **Эта опция является обязательной.** Если вы используете fullPage для проекта с закрытым исходным кодом, то вам следует воспользоваться лицензионным ключом, предоставляемым при приобретении коммерческой лицензии fullPage.если ваш проект открыт с открытым исходным кодом, [свяжитесь со мной](https://alvarotrigo.com/fullPage/extensions/requestKey.html), чтобы получить лицензионный ключ.. Вы можете прочесть подробнее о лицензиях [здесь](https://github.com/alvarotrigo/fullPage.js#license) и [на веб-сайте](https://alvarotrigo.com/fullPage/pricing/). Пример:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tlicenseKey: 'YOUR_KEY_HERE'\r\n});\r\n```\r\n\r\n### controlArrows\r\n(по умолчанию `true`) Определяет использование клавиш-стрелок для передвижения вправо или влево при просмотре слайдов.\r\n\r\n### controlArrowsHTML\r\n(default `['<div class=\"fp-arrow\"></div>', '<div class=\"fp-arrow\"></div>'],`). Provides a way to define the HTML structure and the classes that you want to apply to the control arrows for sections with horizontal slides. The array contains the structure for both arrows. The first item is the left arrow and the second, the right one. (translation needed)\r\n\r\n### verticalCentered\r\n(по умолчанию `true`) Вертикальное центрирование контента в разделах. (Uses flexbox) You might want to wrap your content in a `div` to avoid potential issues. (Uses `flex-direction: column; display: flex; justify-content: center;`)\r\n\r\n### scrollingSpeed\r\n(по умолчанию `700`) Ускорьте на миллисекунды переходы при скроллинге.\r\n\r\n### sectionsColor\r\n(по умолчанию `none`) Присвойте CSS-свойство `background-color` каждому разделу.\r\nПример:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tsectionsColor: ['#f2f2f2', '#4BBFC3', '#7BAABE', 'whitesmoke', '#000'],\r\n});\r\n```\r\n\r\n### anchors\r\n(по умолчанию `[]`) Обеспечивает размещение ссылок с привязками (#пример) в URL для каждого раздела. Значения привязок должны быть уникальными. Положение привязок в ряду будет определять то, к какому разделу применяется привязка. (вторая позиция для второго раздела и так далее). Использование привязок также даёт возможность навигации вперёд и назад в браузере. Эта опция также даёт пользователям возможность добавлять в закладки определённый раздел или слайд. **Внимание!** привязки не могут иметь значение, совпадающее с каким-либо элементом ID на сайте (или элементом NAME - для IE).\r\nТеперь привязки могут добавляться прямо в HTML-структуре с помощью атрибута `data-anchor`, как объясняется здесь.\r\n\r\n### lockAnchors\r\n(по умолчанию `false`) Определяет, будут ли вообще действовать в библиотеке привязки в URL. Вы по-прежнему сможете использовать привязки в закрытом формате для ваших собственных функций и обратных вызовов, но в скроллинге сайта они участвовать не будут. Это полезная функция, если вы хотите совместить fullPage.js с другими плагинами, использующими привязки в URL.\r\n\r\n### easing\r\n(по умолчанию `easeInOutCubic`) Определяет эффект перехода, используемый при вертикальном и горизонтальном скроллинге.\r\nНеобходим файл `vendors/easings.min.js` или [jQuery UI](https://jqueryui.com/) для использования некоторых из [переходов](https://api.jqueryui.com/easings/). Могут использоваться другие библиотеки.\r\n\r\n### easingcss3\r\n(по умолчанию `ease`) Определяет эффект перехода для применения в случае использования `css3:true`. Вы можете использовать [предустановленные эффекты](https://www.w3schools.com/cssref/css3_pr_transition-timing-function.asp) (такие как `linear`, `ease-out`...) или создать свои собственные при помощи функции `cubic-bezier`. Вы также можете использовать для этой цели [Matthew Lein CSS Easing Animation Tool](https://matthewlein.com/ceaser/`).\r\n\r\n### loopTop\r\n(по умолчанию `false`) Определяет, будет ли осуществляться скроллинг к последнему разделу при пролистывании первого раздела вверх.\r\n\r\n### loopBottom\r\n(по умолчанию `false`) Определяет, будет ли осуществляться скроллинг к первому разделу при пролистывании последнего раздела вниз.\r\n\r\n### loopHorizontal\r\n(по умолчанию `true`) Определяет, будут ли горизонтальные слайдеры работать циклично после перехода к последнему или предыдущему слайду.\r\n\r\n### css3\r\n(по умолчанию `true`). Определяет использование JavaScript или CSS3-трансформаций для скроллинга в пределах разделов и слайдов. Эта функция помогает ускорить пролистывание для планшетов и мобильных устройств, браузеры которых поддерживают CSS3. Если установлено значение `true` для этой опции и браузер не поддерживает CSS3, будет использована альтернатива.\r\n\r\n### autoScrolling\r\n(по умолчанию `true`) Определяет использование «автоматического» скроллинга или «обычного». Также эта опция влияет на размещение разделов в окне браузера/устройства для планшетов и мобильных устройств.\r\n\r\n### fitToSection\r\n(по умолчанию `true`) Определяет, нужна ли подстройка разделов под окно просмотра. При установке значения `true` для данной опции текущий активный раздел всегда будет заполнять окно просмотра. В противном случае пользователь будет иметь возможность остановиться на середине раздела (когда )\r\n\r\n### fitToSectionDelay\r\n(по умолчанию 1000). Если для опции `fitToSection` установлено значение `true`, данная функция замедлит подстройку на настроенные миллисекунды.\r\n\r\n### scrollBar\r\n(по умолчанию `false`) Определяет, будет ли использоваться полоса прокрутки на сайте. При использовании полосы прокрутки функция `autoScrolling` будет работать как обычно. Пользователь по-прежнему сможет пролистывать сайт с помощью полосы прокрутки, и fullPage.js подстроит раздел под экран по окончании скроллинга.\r\n\r\n### paddingTop\r\n(по умолчанию `0`) Определяет верхний отступ для каждого раздела в числовом формате (paddingTop: '10px', paddingTop: '10em'...) Данная функция удобна при использовании фиксированных верхних колонтитулов.\r\n\r\n### paddingBottom\r\n(по умолчанию `0`) Определяет нижний отступ для каждого раздела в числовом формате (paddingBottom: '10px', paddingBottom: '10em'...). Данная функция удобна при использовании фиксированных нижних колонтитулов.\r\n\r\n### fixedElements\r\n(по умолчанию `null`) Определяет, какие элементы будут исключены из структуры скроллинга плагина, что необходимо при использовании опции `css3` для их фиксации. Для этого необходима строка с селекторами Javascript для данных элементов. (Например: `fixedElements: '#element1, .element2'`)\r\n\r\n### normalScrollElements\r\n(по умолчанию `null`) [Демо](https://codepen.io/alvarotrigo/pen/RmVazM) Если вы хотите избежать автопрокрутки при скроллинге некоторых элементов, вам нужно использовать эту опцию. (пригодится для карт, прокрутки div-элементов и т.д.) Для этого необходима строка с селекторами Javascript для данных элементов. (Например: `normalScrollElements: '#element1, .element2'`). Данную опцию следует применять к самим разделам/слайдам.\r\n\r\n### bigSectionsDestination\r\n(по умолчанию `null`) [Демо](https://codepen.io/alvarotrigo/pen/vYLdMrx) Определяет, как должна осуществляться прокрутка к разделу, размер которого превышает размер окна просмотра. По умолчанию fullPage.js пролистывает вверх, если вы попадаете из раздела над заданным, и вниз, если вы попадаете из раздела под заданным. Возможные значения: `top`, `bottom`, `null`.\r\n\r\n### adjustOnNavChange\r\n(по умолчанию `true`)\r\nОпределяет, будет ли fullPage.js изменять высоту секций при изменении размера или переключении видимости мобильной навигационной панели или адресной строки. Если установить значение `false`, секции не будут отображаться на всю высоту, когда панель навигации уменьшается или скрывается.\r\n\r\n\r\n### keyboardScrolling\r\n(по умолчанию `true`) Определяет возможность навигации на сайте при помощи клавиатуры.\r\n\r\n### touchSensitivity\r\n(по умолчанию `5`) Определяет ширину и высоту браузеров в процентах, а также то, насколько длинным должно быть пролистывание для перехода к следующему разделу/слайду.\r\n\r\n### skipIntermediateItems\r\n(по умолчанию `false`). Определяет, следует ли пропускать анимацию прокрутки при навигации между неконсеквенционными вертикальными секциями или горизонтальными слайдами. Возможные значения: `true`, `false`, `sections` и `slides`, что позволяет применять это поведение по вертикали, горизонтали или в обоих направлениях.\r\n\r\n### continuousVertical\r\n(по умолчанию `false`) Определяет, будет ли осуществляться скроллинг к последнему разделу при пролистывании первого раздела вверх и к первому разделу при пролистывании последнего раздела вниз. Опция несовместима с опциями `loopTop`, `loopBottom` и любыми полосами прокрутки, используемыми на сайте (`scrollBar:true` или `autoScrolling:false`).\r\n\r\n### continuousHorizontal\r\n(по умолчанию `false`) [Расширение fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Определяет, будет ли при пролистывании вправо последнего слайда осуществляться прокрутка вправо к первому слайду, а также приведёт ли прокрутка влево первого слайда к прокрутке влево к последнему слайду. Опция несовместима с опцией `loopHorizontal`. Необходима версия fullpage.js >= 3.0.1.\r\n\r\n### scrollHorizontally\r\n(по умолчанию `false`) [Расширение fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Определяет осуществление горизонтального пролистывания ползунков при помощи колеса мыши или трекпада. Идеальна для рассказов. It can only be used when using: `autoScrolling:true`. Необходима версия fullpage.js >= 3.0.1.\r\n\r\n### interlockedSlides\r\n(по умолчанию `false`) [Расширение fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Определяет ,будет ли при передвижении одного горизонтального ползунка осуществляться пролистывание ползунков другого раздела в том же направлении. Возможные значения: `true`, `false` или последовательность взаимосвязанных разделов. Например: `[1,3,5]`, начиная с 1. Необходима версия fullpage.js >= 3.0.1.\r\n\r\n### dragAndMove\r\n(по умолчанию `false`) [Расширение fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Активирует или деактивирует протягивание и пролистывание разделов и слайдов при помощи мыши или пальцев. Возможные значения: `true`, `false`, `vertical`, `horizontal`, `fingersonly`, `mouseonly`,. Необходима версия fullPage.js >= 3.0.1.\r\n\r\n### offsetSections\r\n(по умолчанию `false`)[Расширение fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Обеспечивает возможность использовать неполноэкранные разделы на основании их процентных значений. Опция идеальна для демонстрации пользователю того, что на сайте есть больше контента, показывая часть следующего или предыдущего раздела. Необходима версия fullPage.js >= 3.0.1\r\nДля определения процентного значения каждого раздела необходимо использовать атрибут `data-percentage`. Центрирование раздела в окне просмотра может определяться при помощи логического значения в атрибуте `data-centered` (по умолчанию `true`, если не определено). Например:\r\n\r\n``` html\r\n<div class=\"section\" data-percentage=\"80\" data-centered=\"true\">\r\n```\r\n\r\n### resetSliders\r\n(по умолчанию `false`). [Расширение fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Определяет, необходимо ли возвращать в исходное положение каждый ползунок после покидания раздела, в котором он размещён. Необходима версия fullpage.js >= 3.0.1.\r\n\r\n### fadingEffect\r\n(по умолчанию `false`). [Расширение fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Определяет, будет ли использоваться эффект затухания вместо используемого по умолчанию эффекта прокрутки. Возможные значения `true`, `false`, `sections`, `slides`. Таким образом, данный параметр может применяться только вертикально или горизонтально, или же одновременно в обоих направлениях. Необходима версия fullpage.js >= 3.0.1.\r\n\r\n### animateAnchor\r\n(по умолчанию `true`) Определяет, будет ли во время загрузки сайта при использовании привязок (#) осуществляться прокрутка с анимацией к назначенному разделу или же напрямую.\r\n\r\n### recordHistory\r\n(по умолчанию `true`) Определяет, нужно ли отображать состояние сайта в истории браузера. При установке значения `true` каждый раздел/слайд сайта будет действовать как новая страница, и кнопки браузера «назад» и «вперёд» прокрутят разделы/слайды для перехода к предыдущему или следующему состоянию сайта. При установке значения `false` URL будет продолжать меняться, но не отразится на истории браузера. Данная опция отключается автоматически при использовании опции `autoScrolling:false`.\r\n\r\n### menu\r\n(по умолчанию `false`) Селектор может использоваться для связи элементов меню с разделами. Таким образом, скроллинг разделов активирует соответствующий элемент меню при помощи класса `active`.\r\nЭто не приведёт к созданию нового меню, а лишь добавит класс `active` элементу в имеющемся меню с соответствующими ссылками с привязками.\r\nЧтобы связать элементы меню с разделами, необходимо будет использовать информационный блок HTML 5 (`data-menuanchor`) с теми же ссылками с привязками, которые используются в разделах. Пример:\r\n\r\n```html\r\n<ul id=\"myMenu\">\r\n\t<li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">Первый раздел</a></li>\r\n\t<li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Второй раздел</a></li>\r\n\t<li data-menuanchor=\"thirdPage\"><a href=\"#thirdPage\">Третий раздел</a></li>\r\n\t<li data-menuanchor=\"fourthPage\"><a href=\"#fourthPage\">Четвёртый раздел</a></li>\r\n</ul>\r\n```\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\r\n\tmenu: '#myMenu'\r\n});\r\n```\r\n\r\n**Внимание:** элемент меню должен помещаться за пределами обёрточного кода для полного экрана во избежание проблем при использовании `css3:true`. В противном случае он будет присоединён к `body` самим плагином.\r\n\r\n### navigation\r\n(по умолчанию `false`) При установке значения `true` панель навигации будет отображена в виде небольших кружков.\r\n\r\n### navigationPosition\r\n(по умолчанию `none`) Могут быть установлены значения `left` или `right`. Опция определяет, какое положение займет панель навигации (если она используется).\r\n\r\n### navigationTooltips\r\n(по умолчанию []) Определяет справочные надписи, которые будут показаны для кружков навигационной панели, если они используются. Например: `navigationTooltips: ['firstSlide', 'secondSlide']`. Вы можете также определить их с помощью атрибута `data-tooltip` в каждом разделе, если хотите.\r\n\r\n### showActiveTooltip\r\n(по умолчанию `false`) Показывает постоянную справочную надпись для просматриваемого в данный момент раздела в вертикальной навигации.\r\n\r\n### slidesNavigation\r\n(по умолчанию `false`) При установке значения `true` навигационная панель будет отображаться в виде небольших кружков для каждого горизонтального ползунка сайта.\r\n\r\n### slidesNavPosition\r\n(по умолчанию `bottom`) Определяет местоположение горизонтальной навигационной панели для слайдеров. Возможные значения: `top` и `bottom`. При желании вы можете настроить стили CSS для определения расстояния от верхней до нижней части, так же как и любой другой стиль, например, цвет.\r\n\r\n### scrollOverflow\r\n(по умолчанию `true`) определяет необходимость создания прокрутки для раздела/слайда, если контент превышает его высоту. It requires the default value `scrollBar: false`. Чтобы предотвратить создание fullpage.js полосы прокрутки в определённых разделах или слайдах, используйте класс `fp-noscroll`. Например: `<div class=\"section fp-noscroll\">`. Вы можете избежать применения scrolloverflow в отзывчивом режиме, используя `fp-auto-height-responsive` в элементе раздела.\r\n\r\n### scrollOverflowMacStyle\r\n(default `false`). When active, this option will use a \"mac style\" for the scrollbar instead of the default one, which will look quite different in Windows computers. (translation needed)\r\n\r\n### scrollOverflowReset\r\n(по умолчанию `false`) [Расширение fullpage.js](https://alvarotrigo.com/fullPage/extensions/). При установке значения `true` будет осуществляться прокрутка контента раздела/слайда с помощью полосы прокрутки при покидании другого вертикального раздела. Таким образом, раздел/слайд будет всегда показывать начало контента даже при скроллинге из раздела/слайда, расположенного ниже. Possible values are `true`, `false`, `sections`, `slides`.Adding the class `fp-no-scrollOverflowReset` on the section or slide will disable this feature for that specific panel.\r\n\r\n### sectionSelector\r\n(по умолчанию `.section`) Определяет селектор Javascript, используемый для разделов с плагинами. Иногда требуется изменить его, чтобы избежать проблем с другими плагинами, использующими те же селекторы, что и fullpage.js.\r\n\r\n### slideSelector\r\n(по умолчанию `.slide`)  Определяет селектор Javascript, используемый для слайдов с плагинами.  Иногда требуется изменить его, чтобы избежать проблем с другими плагинами, использующими те же селекторы, что и fullpage.js.\r\n\r\n### responsiveWidth\r\n(по умолчанию `0`)  Будет использоваться стандартная прокрутка (`autoScrolling:false`), если ширина меньше, чем заданное значение в пикселях. Класс `fp-responsive` добавляется к тегу body, если пользователь желает использовать для собственного отзывчивого CSS. Например, если установлено значение 900, то, если ширина браузера составляет менее 900, плагин будет прокручивать, как обычный сайт.\r\n\r\n### responsiveHeight\r\n(по умолчанию `0`) Будет использоваться стандартная прокрутка (`autoScrolling:false`), если высота меньше, чем заданное значение в пикселях. Класс `fp-responsive` добавляется к тегу body, если пользователь желает использовать для собственного отзывчивого CSS. Например, если установлено значение 900, то, если высота браузера составляет менее 900, плагин будет прокручивать, как обычный сайт.\r\n\r\n### responsiveSlides\r\n(по умолчанию `false`) [Расширение fullpage.js](https://alvarotrigo.com/fullPage/extensions/). При установке значения `true` слайды будут трансформироваться в вертикальные разделы при активации отзывчивого режима. (с помощью опций `responsiveWidth` или `responsiveHeight`, подробно описанных выше). Необходима версия fullpage.js >= 3.0.1.\r\n\r\n### cinematic\r\n\r\n(по умолчанию `false`) [Расширение fullpage.js](https://alvarotrigo.com/fullPage/extensions/cinematic.html). Включает или отключает эффекты слайдера на секциях. Требуется fullpage.js >= 4.0.41.\r\n\r\n### cinematicOptions\r\n\r\n(по умолчанию: `{Object}`) Позволяет настроить параметры анимации содержимого при использовании опции `cinematic:true`. [Подробнее](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cinematic-Effects#cinematicoptions).\r\n\r\n### effects\r\n(по умолчанию `false`) [Расширение fullpage.js](https://alvarotrigo.com/fullPage/extensions/slider-effects.html). Включает или отключает эффекты слайдера для секций. Требуется fullpage.js версии >= 4.0.35\r\n\r\n### effectsOptions\r\n(по умолчанию: `{Object}`, конфигурация для пресета [\"focus\"](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#20-available-presetss)).  \r\nПозволяет настроить параметры эффектов при использовании опции `effects:true`. [Подробнее об опции effects](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#effects-options-documentation)\r\n\r\n\r\n### parallax\r\n(по умолчанию `false`) [Расширение fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Определяет, будут ли использоваться эффекты параллакс для фона разделов / слайдов. [Узнайте больше об использовании опции параллакс здесь](https://github.com/alvarotrigo/fullPage.js/blob/master/lang/russian/parallax-extension.md).\r\n\r\n### parallaxOptions\r\n(по умолчанию: `{ type: 'reveal', percentage: 62, property: 'translate'}`). \r\nПозволяет настраивать параметры эффекта параллакс для фона при использовании опции parallax:true. [Узнайте больше об использовании опции параллакс здесь](https://github.com/alvarotrigo/fullPage.js/blob/master/lang/russian/parallax-extension.md).\r\n\r\n### dropEffect\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Defines whether or not to use the drop effect on sections / slides. [Read more about how to apply the the drop effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect).\r\n\r\n### dropEffectOptions\r\n(default: `{ speed: 2300, color: '#F82F4D', zIndex: 9999}`). \r\nAllows to configure the parameters for the drop effect when using the option `dropEffect:true`.[Read more about how to apply the the drop effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect).\r\n\r\n### waterEffect\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Defines whether or not to use the water effect on sections / slides. [Read more about how to apply the the water effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect).\r\n\r\n### waterEffectOptions\r\n(default: `{ animateContent: true, animateOnMouseMove: true}`).\r\nAllows to configure the parameters for the water effect when using the option `waterEffect:true`.[Read more about how to apply the the water effect option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect).\r\n\r\n### cards\r\n(default `false`) [Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Defines whether or not to use the cards effect on sections/slides. [Read more about how to apply the cards option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards).\r\n\r\n### cardsOptions\r\n(default: `{ perspective: 100, fadeContent: true, fadeBackground: true}`). \r\nAllows you to configure the parameters for the cards effect when using the option `cards:true`. [Read more about how to apply the cards option](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards).\r\n\r\n### lazyLoading\r\n(по умолчанию `true`) Отложенная загрузка включена по умолчанию, что означает, что данная опция будет осуществлять отложенную загрузку любого медиа-элемента, содержащего атрибут `data-src`, как описано в [документации отложенной загрузки](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Отложенная-загрузка). Если вы желаете использовать любую другую библиотеку отложенной загрузки, вы можете деактивировать данную функцию fullpage.js.\r\n\r\n### lazyLoadThreshold\r\n(по умолчанию `0`) Указывает количество соседних вертикальных секций и горизонтальных слайдов, мультимедийные элементы которых должны быть загружены ленивым образом относительно текущей. Используйте число, чтобы указать, сколько предыдущих и следующих секций или слайдов должно быть предварительно загружено.\r\n\r\n### observer\r\n(default `true`) Defines whether or not to observe changes in the HTML structure of the page. When enabled, fullPage.js will automatically react to those changes and update itself accordingly. Ideal when adding, removing or hidding sections or slides. (translation needed)\r\n\r\n### credits\r\n(default `{enabled: true, label: 'Made with fullpage.js', position: 'right'}`). \r\nDefines whether to use fullPage.js credits. As per clause 0, 4, 5 and 7 of the GPLv3 licecense, those using fullPage.js under the GPLv3 are required to give prominent notice that fullPage.js is in use. We recommend including attribution by keeping this option enabled. (translation needed).  **Примечание:** Для этой опции требуется действительное значение licenseKey.\r\n\r\n## Функции\r\nМожете увидеть их в действии [здесь](https://alvarotrigo.com/fullPage/examples/methods.html)\r\n\r\n### getActiveSection()\r\n[Демо](https://codepen.io/alvarotrigo/pen/VdpzRN/) Даёт объект (наберите [Section](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian#%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B5-%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D1%8B)), содержащий активный слайд и его свойства.\r\n\r\n```javascript\r\nfullpage_api.getActiveSection();\r\n```\r\n\r\n### getActiveSlide()\r\n[Демо](https://codepen.io/alvarotrigo/pen/VdpzRN/) Даёт объект (наберите [Slide](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian#%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B5-%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D1%8B)), содержащий активный раздел и его свойства.\r\n\r\n```javascript\r\nfullpage_api.getActiveSlide();\r\n```\r\n\r\n### getScrollY() & getScrollX\r\n[Demo](https://codepen.io/alvarotrigo/pen/GRyGqro) `getScrollY` Gets the Y position of the fullPage wrapper. `getScrollX` gets the X position of the active horizontal slide.\r\n\r\n```javascript\r\nfullpage_api.getScrollY();\r\nfullpage_api.getScrollX();\r\n```\r\n\r\n### moveSectionUp()\r\n[Демо](https://codepen.io/alvarotrigo/pen/GJXNMN) Прокручивает на один раздел вверх:\r\n```javascript\r\nfullpage_api.moveSectionUp();\r\n```\r\n---\r\n### moveSectionDown()\r\n[Демо](https://codepen.io/alvarotrigo/pen/jPvVZx) Прокручивает на один раздел вниз:\r\n```javascript\r\nfullpage_api.moveSectionDown();\r\n```\r\n---\r\n### moveTo(раздел, слайд)\r\n[Демо](https://codepen.io/alvarotrigo/pen/doqOmY) Прокручивает страницу к заданному разделу и слайду. Первый слайд, отображающийся по умолчанию, будет иметь индекс 0.\r\n```javascript\r\n/*Прокручивание к разделу с ссылкой с привязкой `firstSlide` и ко 2-му слайду */\r\nfullpage_api.moveTo('firstSlide', 2);\r\n\r\n```\r\n\r\n```javascript\r\n//Прокручивание к 3-му разделу на сайте\r\nfullpage_api.moveTo(3, 0);\r\n\r\n//То же самое, что и\r\nfullpage_api.moveTo(3);\r\n```\r\n---\r\n### silentMoveTo(раздел, слайд)\r\n[Демо](https://codepen.io/alvarotrigo/pen/doqOeY)\r\nАбсолютно то же самое, что и [`moveTo`](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#movetoраздел-слайд), но в этом случае функция выполняет прокрутку без анимации. Прямой переход к заданной точке.\r\n```javascript\r\n/*Прокручивание к разделу с ссылкой с привязкой `firstSlide` и ко 2-му слайду */\r\nfullpage_api.silentMoveTo('firstSlide', 2);\r\n```\r\n---\r\n### moveSlideRight()\r\n[Демо](https://codepen.io/alvarotrigo/pen/Wvgoyz)\r\nПрокручивает горизонтальный ползунок текущего раздела к следующему слайду:\r\n```javascript\r\nfullpage_api.moveSlideRight();\r\n```\r\n---\r\n### moveSlideLeft()\r\n[Демо](https://codepen.io/alvarotrigo/pen/gpdLjW)\r\nПрокручивает горизонтальный ползунок текущего раздела к предыдущему слайду:\r\n```javascript\r\nfullpage_api.moveSlideLeft();\r\n```\r\n---\r\n### setAutoScrolling(логическая операция)\r\n[Демо](https://codepen.io/alvarotrigo/pen/rVZWrR) Устанавливает конфигурацию скроллинга в режиме реального времени.\r\nОпределяет поведение прокрутки страницы. При установке значения `true` будет использоваться \"автоматический\" скроллинг, в противном случае будет применяться \"стандартная\" прокрутка сайта или прокрутка \"вручную\".\r\n\r\n```javascript\r\nfullpage_api.setAutoScrolling(false);\r\n```\r\n---\r\n### setFitToSection(логическая операция)\r\n[Демо](https://codepen.io/alvarotrigo/pen/GJXNYm)\r\nУстанавливает значение для опции `fitToSection`, определяющей, подстраивать ли раздел под экран.\r\n\r\n```javascript\r\nfullpage_api.setFitToSection(false);\r\n```\r\n---\r\n### fitToSection()\r\n[Демо](https://codepen.io/alvarotrigo/pen/JWWagj)\r\nПрокручивает к ближайшему активному разделу, подстраивая его под окно просмотра.\r\n\r\n```javascript\r\nfullpage_api.fitToSection();\r\n```\r\n---\r\n### setLockAnchors(логическая операция)\r\n[Демо](https://codepen.io/alvarotrigo/pen/yNxVRQ)\r\nУстанавливает значение для опции `lockAnchors`, определяющей, будут ли привязки отражаться в URL.\r\n\r\n```javascript\r\nfullpage_api.setLockAnchors(false);\r\n```\r\n---\r\n### setAllowScrolling(логическая операция, [направления])\r\n[Демо](https://codepen.io/alvarotrigo/pen/EjeNdq) Даёт или убирает возможность скроллинга разделов/слайдов с помощью колеса мыши/трекпада или сенсорных жестов(включено по умолчанию). Обратите внимание, что функция не деактивирует скроллинг с помощью клавиатуры. Для этого вам потребуется использовать `setKeyboardScrolling`.\r\n\r\n- `directions`: (опциональный параметр) Значения: `all`, `up`, `down`, `left`, `right` или их комбинация, разделённая запятыми, например: `down, right`. Функция определяет направление, в котором будет активирован или деактивирован скроллинг.\r\n\r\n```javascript\r\n\r\n//деактивация прокрутки\r\nfullpage_api.setAllowScrolling(false);\r\n\r\n//деактивация прокрутки вниз\r\nfullpage_api.setAllowScrolling(false, 'down');\r\n\r\n// деактивация прокрутки вниз и вправо\r\nfullpage_api.setAllowScrolling(false, 'down, right');\r\n```\r\n---\r\n### setKeyboardScrolling(логическая операция, [направления])\r\n[Демо](https://codepen.io/alvarotrigo/pen/GJXNwm) Даёт или убирает возможность скроллинга разделов с помощью клавиатуры (включено по умолчанию).\r\n\r\n- `directions`: (опциональный параметр) Значения: `all`, `up`, `down`, `left`, `right` или их комбинация, разделённая запятыми, например: `down, right`. Функция определяет направление, в котором будет активирован или деактивирован скроллинг.\r\n\r\n```javascript\r\n// деактивация всей прокрутки с помощью клавиатуры fullpage_api.setKeyboardScrolling(false);\r\n\r\n// деактивация прокрутки вниз с помощью клавиатуры\r\nfullpage_api.setKeyboardScrolling(false, 'down');\r\n\r\n//деактивация прокрутки вниз и вправо с помощью клавиатуры fullpage_api.setKeyboardScrolling(false, 'down, right');\r\n```\r\n---\r\n### setRecordHistory(логическая операция)\r\n[Демо](https://codepen.io/alvarotrigo/pen/rVZWQb) Определяет, записывать ли историю для каждого изменения hash в URL.\r\n\r\n```javascript\r\nfullpage_api.setRecordHistory(false);\r\n```\r\n---\r\n### setScrollingSpeed(миллисекунды)\r\n[Демо](https://codepen.io/alvarotrigo/pen/NqLbeY) Определяет скорость прокрутки в миллисекундах.\r\n\r\n```javascript\r\nfullpage_api.setScrollingSpeed(700);\r\n```\r\n---\r\n### destroy(тип)\r\n[Демо](https://codepen.io/alvarotrigo/pen/bdxBzv) Разрушает события плагина и, опционально, его HTML-разметку и стили.\r\nИдеальна при использовании AJAX для загрузки контента.\r\n\r\n- `type`: (опциональный параметр) может быть пустым или иметь значение `all`. Если установлено `all`, HTML-разметка и стили, используемые fullpage.js, будут удалены. Таким образом, оригинальная HTML-разметка, используемая до произведения любой модификации плагина, будет сохранена.\r\n\r\n```javascript\r\n//разрушение всех событий Javascript, созданных fullPage.js (прокручивания, изменения hash в URL...)\r\nfullpage_api.destroy();\r\n\r\n// разрушение всех событий Javascript и любых модификаций, произведённых fullPage.js поверх вашей оригинальной HTML-разметки.\r\nfullpage_api.destroy('all');\r\n```\r\n---\r\n### reBuild()\r\nОбновляет DOM-структуру для подстройки под новый размер окна или его содержимого.\r\nИдеальна для использования в комбинации с вызовами AJAX или внешними изменениями в DOM-структуре сайта, особенно при применении `scrollOverflow:true`.\r\n\r\n```javascript\r\nfullpage_api.reBuild();\r\n```\r\n---\r\n### setResponsive(логическая операция)\r\n[Демо](https://codepen.io/alvarotrigo/pen/WxOyLA) Устанавливает отзывчивый режима на странице. При установке хначения `true` автопрокрутка будет отключена, результат будет тем же самым, как при активации опций `responsiveWidth` или `responsiveHeight`.\r\n```javascript\r\nfullpage_api.setResponsive(true);\r\n```\r\n---\r\n### responsiveSlides.toSections()\r\n[Расширение fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Необходима версия fullpage.js >= 3.0.1.\r\nТрансформирует горизонтальные слайды в вертикальные разделы.\r\n\r\n```javascript\r\nfullpage_api.responsiveSlides.toSections();\r\n```\r\n---\r\n### responsiveSlides.toSlides()\r\n[Расширение fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Необходима версия fullpage.js >= 3.0.1.\r\nТрансформирует оригинальные слайды (теперь трансформированные в вертикальные разделы) обратно в горизонтальные слайды.\r\n\r\n```javascript\r\nfullpage_api.responsiveSlides.toSlides();\r\n```\r\n\r\n## Обратные вызовы\r\n[Демо](https://codepen.io/alvarotrigo/pen/XbPNQv) Можете увидеть их в действии [здесь](https://alvarotrigo.com/fullPage/examples/callbacks.html).\r\n\r\nНекоторые обратные вызовы, такие как `onLeave`, будут содержать тип параметров `Section` или `Slide`. Эти объекты будут содержать следующие свойства:\r\n\r\n- `anchor`: *(String)* ссылка с привязкой объекта.\r\n- `index`: *(Number)* индекс объекта.\r\n- `item`: *(DOM element)* элемент объекта.\r\n- `isFirst`: *(Boolean)* определяет, является ли объект первым дочерним элементом.\r\n- `isLast`: *(Boolean)* определяет, является ли объект последним дочерним элементом.\r\n\r\n### afterLoad (`origin`, `destination`, `direction`, `trigger`)\r\nОбратный вызов активируется после загрузки разделов и завершения прокрутки.\r\nПараметры:\r\n\r\n- `origin`: *(Object)* активный раздел\r\n- `destination`: *(Object)* конечный раздел.\r\n- `direction`: *(String)* будет принимать значения `up` или `down` в зависимости от направления скроллинга.\r\n\r\nПример:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\r\n\r\n\tafterLoad: function(origin, destination, direction, trigger){\r\n\t\tvar origin = this;\r\n\r\n\t\t//использование индекса\r\n\t\tif(origin.index == 2){\r\n\t\t\talert(\"Section 3 ended loading\");\r\n\t\t}\r\n\r\n\t\t//использование ссылки с привязкой\r\n\t\tif(origin.anchor == 'secondSlide'){\r\n\t\t\talert(\"Section 2 ended loading\");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n---\r\n### onLeave (`index`, `nextIndex`, `direction`, `trigger`)\r\nЭтот обратный вызов активируется, когда пользователь покидает раздел, при переходе к новому разделу.\r\nВозврат `false` отменит переход до его осуществления.\r\n\r\nПараметры:\r\n\r\n- `origin`:  *(Object)* исходный раздел.\r\n- `destination`: *(Object)* конечный раздел.\r\n- `direction`: *(String)* будет принимать значения `up` или `down` в зависимости от направления скроллинга.\r\n\r\nПример:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tonLeave: function(origin, destination, direction, trigger){\r\n\t\tvar origin = this;\r\n\r\n\t\t//после покидания раздела 2\r\n\t\tif(origin.index == 1 && direction =='down'){\r\n\t\t\talert(\"Going to section 3!\");\r\n\t\t}\r\n\r\n\t\telse if(origin.index == 1 && direction == 'up'){\r\n\t\t\talert(\"Going to section 1!\");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n\r\n---\r\n### beforeLeave (`origin`, `destination`, `direction`, `trigger`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback is fired right **before** leaving the section, just before the transition takes place.\r\n\r\nYou can use this callback to prevent and cancel the scroll before it takes place by returning `false`.\r\n\r\nParameters:\r\n\r\n- `origin`:  *(Object)* section of origin.\r\n- `destination`: *(Object)* destination section.\r\n- `direction`: *(String)* it will take the values `up` or `down` depending on the scrolling direction.\r\n- `trigger`: *(String)* indicates what triggered the scroll. It can be: \"wheel\", \"keydown\", \"menu\", \"slideArrow\", \"verticalNav\", \"horizontalNav\".\r\n\r\nExample:\r\n\r\n```javascript\r\n\r\nvar cont = 0;\r\nnew fullpage('#fullpage', {\r\n\tbeforeLeave: function(origin, destination, direction, trigger){\r\n\r\n\t\t// prevents scroll until we scroll 4 times\r\n\t\tcont++;\r\n\t\treturn cont === 4;\r\n\t}\r\n});\r\n```\r\n---\r\n### afterRender()\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Этот обратный вызов активируется сразу после того, как создаётся структура страницы. Данный обратный вызов вы можете использовать для инициализации других плагинов или активации любого кода, для чего требуется готовый документ (так как плагин изменяет DOM для создания финальной структуры). Более подробную информацию вы найдёте в разделе [Часто задаваемые вопросы](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions).\r\n\r\nПример:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterRender: function(){\r\n\t\tvar pluginContainer = this;\r\n\t\talert(\"Финальная DOM-структура готова\");\r\n\t}\r\n});\r\n```\r\n---\r\n### afterResize(`width`, `height`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Этот обратный вызов активируется после изменения размера окна браузера. Сразу после изменения размера разделов.\r\n\r\nПараметры:\r\n\r\n- `width`:  *(Number)* ширина окна.\r\n- `height`: *(Number)* высота окна.\r\n\r\nПример:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterResize: function(width, height){\r\n\t\tvar pluginContainer = this;\r\n\t\talert(\"Завершено изменение размера разделов\");\r\n\t}\r\n});\r\n```\r\n---\r\n### afterReBuild()\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback is fired after manually re-building fullpage.js by calling `fullpage_api.reBuild()`.\r\n\r\nExample:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterReBuild: function(){\r\n\t\tconsole.log(\"fullPage.js has manually being re-builded\");\r\n\t}\r\n});\r\n```\r\n---\r\n### afterResponsive(`isResponsive`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Этот обратный вызов активируется после того, как fullpage.js переходит из стандартного режима в отзывчивый режим или из отзывчивого в стандартный.\r\n\r\nПараметры:\r\n\r\n- `isResponsive`: *(Boolean)* логическая операция, которая определяет переход в режим отзывчивости (`true`) или переход обратно к стандартному режиму (`false`).\r\n\r\nПример:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterResponsive: function(isResponsive){\r\n\t\talert(\"Is responsive: \" + isResponsive);\r\n\t}\r\n});\r\n```\r\n---\r\n### afterSlideLoad (`section`, `origin`, `destination`, `direction`, `trigger`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Обратный вызов активируется после загрузки слайда раздела и окончания прокрутки.\r\n\r\nПараметры:\r\n\r\n- `section`: *(Object)* активный вертикальный раздел.\r\n- `origin`: *(Object)* исходный горизонтальный слайд.\r\n- `destination`: *(Object)* конечный горизонтальный слайд.\r\n- `direction`: *(String)* `right` или `left` в зависимости от направления скроллинга.\r\n\r\nПример:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\r\n\r\n\tafterSlideLoad: function( section, origin, destination, direction, trigger){\r\n\t\tvar loadedSlide = this;\r\n\r\n\t\t//первый слайд второго раздела\r\n\t\tif(section.anchor == 'secondPage' && destination.index == 1){\r\n\t\t\talert(\"Первый слайд загружен\");\r\n\t\t}\r\n\r\n\t\t//второй слайд второго раздела (supposing #secondSlide is the\r\n\t\t//привязка для второго раздела\r\n\t\tif(section.index == 1 && destination.anchor == 'secondSlide'){\r\n\t\t\talert(\"Второй слайд загружен\");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n\r\n\r\n---\r\n### onSlideLeave (`section`, `origin`, `destination`, `direction`, `trigger`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Этот обратный вызов активируется после того, как пользователь покидает слайд для перехода к другому, при переходе к новому слайду.\r\nВозврат `false` отменит переход до его осуществления.\r\n\r\nПараметр:\r\n\r\n- `section`: *(Object)* активный вертикальный раздел.\r\n- `origin`: *(Object)* исходный горизонтальный слайд.\r\n- `destination`: *(Object)* конечный горизонтальный слайд.\r\n- `direction`: *(String)* `right` или `left` в зависимости от направления скроллинга.\r\n\r\n\r\nПример:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tonSlideLeave: function( section, origin, destination, direction, trigger){\r\n\t\tvar leavingSlide = this;\r\n\r\n\t\t//переход от первого слайда 2го раздела вправо\r\n\t\tif(section.index == 1 && origin.index == 0 && direction == 'right'){\r\n\t\t\talert(\"Покидание первого слайда!!\");\r\n\t\t}\r\n\r\n\t\t// переход от 3го слайда 2го раздела влево\r\n               if(section.index == 1 && origin.index == 2 && direction == 'left'){\r\n\t\t\talert(\"Переход к слайду 2! \");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n\r\n#### Отмена перехода до его осуществления\r\nВы можете отменить переход с помощью возврата `false` на обратном вызове `onSlideLeave`. [То же самое, что и при отмене перехода с помощью `onLeave`](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian/#Отмена-перехода-до-его-осуществления).\r\n\r\n\r\n---\r\n### onScrollOverflow (`section`, `slide`, `position`, `direction`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback gets fired when a scrolling inside a scrollable section when using the fullPage.js option `scrollOverflow: true`.\r\n\r\nParameters:\r\n\r\n- `section`: *(Object)* active vertical section.\r\n- `slide`: *(Object)* horizontal slide of origin.\r\n- `position`: *(Integer)* scrolled amount within the section/slide. Starts on 0.\r\n- `direction`: *(String)* `up` or `down`\r\n\r\nExample:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tonScrollOverflow: function( section, slide, position, direction){\r\n\t\tconsole.log(section);\r\n\t\tconsole.log(\"position: \" + position);\r\n\t}\r\n});\r\n```\r\n\r\n\r\n# Сообщение о проблемах\r\n1. Пожалуйста, перед вопросом поищите свою проблему с помощью поиска github issues.\r\n2. Убедитесь, что используете последнюю версию fullpage.js. Техподдержка не работает со старыми версиями.\r\n3. Воспользуйтесь [форумом Github Issues](https://github.com/alvarotrigo/fullPage.js/issues), чтобы задать вопрос.\r\n4. **Потребуется отдельное воспроизведение проблемы.** По возможности используйте для этого [jsfiddle](https://jsfiddle.net/alvarotrigo/ea17skjr/) или [codepen](https://codepen.io/alvarotrigo/pen/qqabrp).\r\n\r\n# Внесение предложений для fullpage.js\r\nПожалуйста, прочтите [Contributing to fullpage.js](https://github.com/alvarotrigo/fullPage.js/wiki/Contributing-to-fullpage.js)\r\n\r\n# Changelog\r\nЧтобы посмотреть список последних изменений, пожалуйста, обратитесь к  [разделу Релизы](https://github.com/alvarotrigo/fullPage.js/releases).\r\n\r\n# Задачи по построению\r\nЖелаете построить дистрибутивные файлы fullpage.js? Пожалуйста, зайдите в раздел [Задачи по построению](https://github.com/alvarotrigo/fullPage.js/wiki/Build-tasks)\r\n\r\n# Ресурсы\r\n- Wordpress Plugin [for Gutenberg](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/) and [for Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/).\r\n- [Тема Wordpress](https://alvarotrigo.com/fullPage/utils/wordpress.html)\r\n- [Official Vue.js wrapper component](https://github.com/alvarotrigo/vue-fullpage.js)\r\n- [Official React.js wrapper component](https://github.com/alvarotrigo/react-fullpage)\r\n- [Official Angular wrapper component](https://github.com/alvarotrigo/angular-fullpage)\r\n- [CSS Easing Animation Tool - Matthew Lein](https://matthewlein.com/ceaser/) (поможет в определении значения `easingcss3`)\r\n- [fullPage.js jsDelivr CDN](https://www.jsdelivr.com/package/npm/fullpage.js)\r\n- [плагин fullPage.js для October CMS](https://github.com/freestream/oc-parallax-plugin)\r\n- [директива fullPage.js Angular2](https://github.com/meiblorn/ng2-fullpage)\r\n- [директива fullPage.js angular](https://github.com/hellsan631/angular-fullpage.js)\r\n- [дополнение ember-cli fullPage.js](https://www.npmjs.com/package/ember-cli-fullpagejs)\r\n- [fullPage.js Rails Ruby Gem](https://rubygems.org/gems/fullpagejs-rails)\r\n- [Angular fullPage.js – адаптация для Angular.js v1.x](https://github.com/mmautomatizacion/angular-fullpage.js)\r\n- [Интеграция fullPage.js с Wordpress (Обучение)](https://premium.wpmudev.org/blog/build-apple-inspired-full-page-scrolling-pages-for-your-wordpress-site/)\r\n\r\n## Кто пользуется fullPage.js\r\n\r\n![Who is using fullPage.js](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/using-fullpage.png)\r\n\r\n- http://www.bbc.co.uk/news/resources/idt-d88680d1-26f2-4863-be95-83298fd01e02\r\n- http://medoff.ua/en/\r\n- http://promo.prestigio.com/grace1/\r\n- http://torchbrowser.com/\r\n- http://www.boxreload.com/\r\n- http://boxx.hk/\r\n- http://www.villareginateodolinda.it\r\n\r\n## Sponsors\r\nСтаньте спонсором, и ваш логотип появится в нашем README на GitHub с ссылкой на ваш сайт. [[Связаться с нами](https://alvarotrigo.com/#contact)] | [[Станьте патроном]](https://www.patreon.com/fullpagejs) | [Станьте спонсором на GitHub](https://github.com/sponsors/alvarotrigo)\r\n\r\n\r\n[![Warp](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/warp.png)](http://go.warp.dev/fullPage)\r\n[![Crawlbase](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/crawlbase.png)](https://crawlbase.com/?utm_source=github&utm_medium=sponsor&utm_campaign=fullpagejs)\r\n[![TestMu](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/testmu-ai.png)](https://www.testmu.com/?utm_source=fullpagejs&utm_medium=sponsor)\r\n[![Codeless](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codeless.png)](https://codeless.co)\r\n[![Stackpath](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/stackpath3.png)](https://www.stackpath.com/)\r\n[![Browserstack](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/browserstack3.png)](http://www.browserstack.com/)\r\n[![CodePen](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codepen3.png)](https://codepen.com)\r\n\r\n### People\r\n<a href=\"https://github.com/donsalvadori\" target=\"_blank\" rel=\"nofollow\">\r\n\t<img src=\"http://wallpapers-for-ipad.com/fullpage/imgs3/avatars/donsalvadori.jpg\">\r\n</a>\r\n\r\n## Contributors\r\n\r\n<a href=\"https://github.com/alvarotrigo/fullPage.js/graphs/contributors\">\r\n  <img src=\"https://contrib.rocks/image?repo=alvarotrigo/fullPage.js&max=400&columns=25&anon=1&v=2\" />\r\n</a>"
  },
  {
    "path": "lang/russian/how-to-activate-fullpage-extension.md",
    "content": "# Как активировать расширение fullPage.js\n\n1. Перейдите по [URL](https://alvarotrigo.com/fullPage/extensions/activationKey.html), который был отправлен на ваш электронный адрес при покупке расширения. (https://alvarotrigo.com/fullPage/extensions/activationKey.html)\n2. Введите ключ лицензии, предоставленный вам при покупке. Он также есть в электронном письме, подтверждающем вашу покупку.\n3. Дополнительно может потребоваться имя домена для получения ключа активации для вашего продукта.\n4. Затем добавьте ключ активации для определённого расширения, добавив опцию в инициализацию fullpage.js в виде `nameOfExtension + \"Key\": key`:\n\nНапример:\n\n```javascript\nvar myFullpage = new fullpage('#fullpage', {\n    fadingEffect: true,\n    fadingEffectKey: 'ЗДЕСЬ ДОЛЖЕН БЫТЬ КЛЮЧ АКТИВАЦИИ',\n});\n```\nТо же самое нужно сделать и для остальных расширений, если вы ими пользуетесь.\nНиже приведены опции расширений, доступные сейчас:\n* `fadingEffectKey`\n* `responsiveSlidesKey`\n* `continuousHorizontalKey`\n* `interlockedSlidesKey`\n* `scrollHorizontallyKey`\n* `resetSlidersKey`\n* `offsetSectionsKey`\n* `dragAndMoveKey`\n* `parallaxKey`\n* `cardsKey`\n\n\nПомните, что для применения расширений требуется использование [`fullpage.extensions.min.js`](https://github.com/alvarotrigo/fullPage.js/blob/master/dist/fullpage.extensions.min.js) вместо стандартного файла fullPage.js (`fullpage.js`), как объясняется в параграфе [использование расширений] (https://github.com/alvarotrigo/fullPage.js#use-extensions).\n\n\n### What to do for development environments / websites?\nNo activation key is necessary for localhost and 127.0.0.1. Any other staging domains will require a license (Professional or Business) that allows to generate a new key for those.\n\nIf you have a license that allows you to generate multiple activation keys you might want to use the same JS code for all of them. In this case you can use an array with the different keys for each domain, for example, if we are using the `scrollHorizontally` extension for 3 domains, we can do the following:\n\n```js\nnew fullPage('#fullpage', {\n    scrollHorizontally: true,\n    scrollHorizontallyKey: ['domain1_key', 'domain2_key', 'domain3_key'] \n});\n```\n\nThis way the extension can be used in any of those 3 domains.\n"
  },
  {
    "path": "lang/russian/parallax-extension.md",
    "content": "# Расширение параллакс\n\n![](https://cloud.githubusercontent.com/assets/1706326/23580315/f28edab4-00f6-11e7-90f9-81ffafd77b0e.gif)\n\nПрочтите раздел [Использование расширений](https://github.com/alvarotrigo/fullPage.js/tree/dev/lang/russian#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B9) перед использованием опции параллакс.\n- [Живое демо](http://alvarotrigo.com/fullPage/extensions/parallax.html)\n- [Необходимая HTML-структура](#Необходимая-html-структура)\n- [Добавление фона](#Добавление-фона)\n- [Опции](#Опции)\n  - [Эффекты параллакс](#Эффекты-параллакс)\n- [Функции](#Функции)\n\n## Необходимая HTML-структура\nЧтобы использовать эффект параллакс в разделах и слайдах, необходимо добавить новый элемент с классом `fp-bg`. Это должен быть пустой `div`, который следует разместить как первый дочерний элемент раздела или слайда. Например:\n```html\n<div class=\"fp-bg\"></div>\n```\n\nЭто будет элемент, к которому вы должны будете добавить фон, вместо добавления его к разделу или слайдам, где он должен отобразиться.\n\nНапример:\n```html\n<div id=\"fullpage\">\n    <div class=\"section\" id=\"section1\">\n        <div class=\"fp-bg\"></div>\n        Слайд 1.1\n    </div>\n    <div class=\"section\" id=\"section2\">\n        <div class=\"slide\" id=\"slide2-1\">\n            <div class=\"fp-bg\"></div>\n            Слайд 2.1\n        </div>\n        <div class=\"slide\" id=\"slide2-2\">\n            <div class=\"fp-bg\"></div>\n            Слайд 2.2\n        </div>\n    </div>\n</div>\n```\n\nДанную структуру можно увидеть в исходном коде [демо-страницы параллакс](http://alvarotrigo.com/fullPage/extensions/parallax.html).\n\n> Если по какой-либо причине вы не желаете добавлять новый элемент в вашу разметку, вы можете установить опцию `property` в `parallaxOptions` для `background`, чтобы применить эффект к фону текущего раздела или слайда.\n> Как объясняется в параграфе Эффекты параллакс, я рекомендую делать это только в случае крайней необходимости, так как воспроизведение будет не таким, как при использовании элементов `fp-bg`.\n\n<br>\n\n## Добавление фона\nФон должен добавляться к элементу `fp-bg` точно так же, как вы добавляли бы его к разделу или слайду.\nВы можете использовать CSS или встроенные стили.\n\nНапример:\n\n```css\n#section1 .fp-bg{\n    background-image: url('imgs/alvaro-genious.jpg');\n    background-size: cover;\n    background-position: center 80%;\n}\n```\n## Опции\n\n| Опция  | Описание |\n| ------------- | ------------- |\n| **parallax**  | (по умолчанию: `false`). [Расширение fullPage.js](http://alvarotrigo.com/fullPage/extensions/). Определяет, будут ли использоваться эффекты параллакс для фона разделов / слайдов. Possible values are false, true, sections, slides.|\n| **parallaxOptions:**   | (по умолчанию: `{ type: 'reveal', percentage: 62, property: 'translate'}`). Позволяет изменять параметры эффекта параллакс для фона при использовании опции  `parallax:true`.  |\n<br>\n\n### Эффекты параллакс\nВы можете увидеть их в действии [на демо-странице](http://alvarotrigo.com/fullPage/extensions/parallax.html)\n\nОписание изменяемых опций, доступных в `parallaxOptions`:\n\n| parallaxOptions  | Описание |\n| ------------- | ------------- |\n| **type**  | (по умолчанию: `reveal`) Возможные значения `cover` и `reveal`. Обеспечивает возможность выбрать, будет ли текущий раздел/слайд отображаться выше или ниже заданного. При использовании `cover` следующий раздел или слайд появится, закрывая часть текущего. Использование `reveal` произведёт обратный эффект и закроет часть заданного при его отображении. |\n| **percentage**  | (по умолчанию: 62 ) обеспечивает возможность определить процентное соотношение эффекта параллакс к окну просмотра. Меньшее значение даст меньший эффект параллакс, а значение 100, являющееся максимальным, даст полностью статичные фоны. |\n| **property** | Определяет, применять ли эффект параллакс к элементу `fp-bg` или непосредственно к свойству фона раздела или слайда. Для этой опции рекомендуется использовать значение по умолчанию.\n|\n\nОбратите внимание, что использование элемента `fp-bg` обеспечивает лучшее воспроизведение, так как в этом случае используется аппаратное ускорение translate3d. Опция пригодится тем, кто по тем или иным причинам не желает добавлять элемент `fp-bg` в каждом разделе или слайде или просто не может изменить HTML-разметку.\n\n## Функции\nВы можете увидеть их в действии [на демо-странице](http://alvarotrigo.com/fullPage/extensions/parallax.html)\n\n### setOption(optionName, значение)\nУстанавливает значение для данной опции. `optionName` может быть любой из опций, доступных в `parallaxOptions`. (`type`, `percentage` или `property`).\n```javascript\n//изменение значения для свойства `type`\nfullpage_api.parallax.setOption('type', 'cover');\n\n//изменение значения для свойства `percentage`\nfullpage_api.parallax.setOption('percentage', '30');\n```\n---\n\n### init()\nАктивирует эффект параллакс. Функция полезна, если вам необходимо активировать эффект в динамическом режиме в определённый момент.\n```javascript\nfullpage_api.parallax.init();\n```\n---\n### destroy()\nОтключает эффект параллакс.\n```javascript\nfullpage_api.parallax.destroy();\n```\n"
  },
  {
    "path": "lang/spanish/README.md",
    "content": "# fullPage.js\r\n\r\n![preview](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/intro.png)\r\n![compatibility](https://raw.github.com/alvarotrigo/fullPage.js/master/examples/imgs/compatible.png)\r\n\r\n<p align=\"center\">\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js#fullpagejs\">English</a> |\r\n  <span>Español</span> | \r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/french#fullpagejs\">Français</a> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian#fullpagejs\">Pусский</a> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese#fullpagejs\">中文</a> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean#fullpagejs\">한국어</a> |\r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese#fullpagejs\"> 日本語</a> | \r\n  <a href=\"https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese#fullpagejs\">Português Brasileiro</a>\r\n</p>\r\n\r\n<p align=\"center\">\r\n\tDisponible para <a href=\"https://github.com/alvarotrigo/vue-fullpage.js\">Vue</a>, <a href=\"https://github.com/alvarotrigo/react-fullpage\">React</a> y <a href=\"https://github.com/alvarotrigo/angular-fullpage\">Angular</a>.\r\n</p>\r\n\r\n---\r\n\r\n![fullPage.js version](https://img.shields.io/badge/fullPage.js-v4.0.41-brightgreen.svg)\r\n[![License](https://img.shields.io/badge/License-GPL-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.html)\r\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/fullpage.js/badge?style=rounded)](https://www.jsdelivr.com/package/npm/fullpage.js)\r\n[![Minzipped Size](https://img.shields.io/bundlephobia/minzip/fullpage.js)](https://bundlephobia.com/package/fullpage.js)\r\n&nbsp;&nbsp;**|**&nbsp;&nbsp; *Created by [@imac2](https://twitter.com/imac2)*\r\n\r\n- [Demo online](https://alvarotrigo.com/fullPage/) | [Codepen](https://codepen.io/alvarotrigo/pen/NxyPPp)\r\n- [Wordpress plugin for Gutenberg](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/) and [WordPress pluging fo Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/)\r\n- [Template de Wordpress](https://alvarotrigo.com/fullPage/utils/wordpress.html)\r\n- [Extensiones de fullpage.js](https://alvarotrigo.com/fullPage/extensions/)\r\n- [Preguntas frecuentes](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions)\r\n- [[Migration from fullPage v3 to fullpage v4]](https://alvarotrigo.com/fullPage/help/migration-from-fullpage-3/)\r\n---\r\n\r\nUna sencilla librería Javascript para la creación de páginas web con desplazamiento a pantalla completa. También conocida popularmente como \"single page websites\" o \"onepage sites\".\r\nPermite crear un desplazamiento a pantalla completa, asi como añadir diapositivas horizontales en las secciones.\r\n\r\n- [Introducción](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#introducción)\r\n- [Compabitilidad](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#compatibilidad)\r\n- [Licencia](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#licencia)\r\n- [Uso](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#uso)\r\n  - [Crear enlaces a secciones y diapositivas](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#crear-enlaces-a-secciones-y-diapositivas)\r\n  - [Crear secciones más pequeñas o más grandes](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#crear-seciones-más-pequenas-o-más-grandes)\r\n  - [Clases de estado añadidas por fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#classes-de-estado-añadidas-por-fullpagejs)\r\n  - [Carga pasiva de elementos multimedia](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#carga-pasiva-de-elementos-multimedia)\r\n  - [Autoplay de elementos multimedia](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#autoreproducir-elementos-multimedia)\r\n  - [Uso de extensiones](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#uso-de-extensiones)\r\n- [Opciones](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#opciones)\r\n- [Metodos](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#métodos)\r\n- [Callbacks](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#callbacks)\r\n- [Reportar problemas](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#reportando-problemas)\r\n- [Contribuir a fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#contribuir-con-fullpagejs)\r\n- [Changelog](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#changelog)\r\n- [Build tasks](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#build-tasks)\r\n- [Recursos](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#recursos)\r\n- [Quien usa fullpage.js](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#quién-usa-fullpagejs)\r\n- [Donaciones](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish/#donaciones)\r\n\r\n## Introducción\r\nLas sugerencias serán más que bienvenidas, no solamente por pedidos de nuevas funcionalidades, sino también mejoras en el código.\r\n¡Hagamos de fullPage.js una gran librería para facilitar la vida de las personas!\r\n\r\n## Compatibilidad\r\nfullPage.js es totalmente compatible y funcional con cualquier navegador moderno y con IE 11. Si necesitas soporte para IE < 11 considera usar [fullPage.js v3](https://github.com/alvarotrigo/fullPage.js/tree/3.1.2).\r\nTambién provee soporte táctil en dispositivos móviles, tabletas y ordenadores con pantalla táctil.\r\n\r\nGracias a [Browserstack](https://www.browserstack.com/) por dar soporte a fullPage.js.\r\n\r\n### Licencia\r\n\r\n#### Commercial license\r\nSi quieres usar fullpage para desarrollo de páginas comerciales, templates, themes, proyectos y aplicaciones, la licencia Comercial es la licencia apropiada para ti. Con esta opción, tu código se mantendrá propietario. Es decir, no tendrás que cambiar la liencia del código de tu aplicación/web/theme etc a la licencia GPL de código abierto.\r\n[[Compra la licencia comercial]](https://alvarotrigo.com/fullPage/pricing/)\r\n\r\n#### Open source license\r\nSi estás creando una aplicación de código libre bajo una licencia compatible con la liencia de [GNU GPL license v3](https://www.gnu.org/licenses/gpl-3.0.html), podrás hacer uso de fullPage bajo los términos de la licencia GPLv3.\r\n[Read more about fullPage's license](https://alvarotrigo.com/fullPage/pricing/).\r\n\r\n**Tendrás que añadir un aviso destacado indicando que la página usa fullPage.js. Los créditos en los comentarios en los ficheros JavaScript y CSS tendrán que mantenerse intactos.** (Incluso después de ser minificados/comprimidos)\r\n\r\n## Uso\r\nComo podéis ver en los ejemplos disponibles, es necesario incluir:\r\n - El archivo de JavaScript `fullpage.js` (o su versión minificada `fullpage.min.js`)\r\n - El archivo CSS `fullpage.css` (o su versión minificada `fullpage.min.css`)\r\n\r\n**Opcionalmente**, cuando se usa la opcion `css3:false`, puedes añadir la librería de [jQuery UI](https://jqueryui.com/) en caso que desee usar otro efecto \"easing\" en lugar de los que están incluidos en la libreria (`easeInOutCubic`).\r\n\r\n### Instalar usando bower o npm\r\n**Opcionalmente**, puedes instalar fullPage.js haciendo uso de Bower o npm si lo prefieres:\r\n\r\nTerminal:\r\n```shell\r\n// Con bower\r\nbower install fullpage.js\r\n\r\n// Con npm\r\nnpm install fullpage.js\r\n```\r\n\r\n### Incluyendo los archivos:\r\n```html\r\n<link rel=\"stylesheet\" type=\"text/css\" href=\"fullpage.css\" />\r\n\r\n\r\n<!-- Esta línea es opcional. Sólamente es necesaria si se hace uso de la opción `css3:false` y se quiere usar otro efecto `easing` en lugar de `linear`, `swing` o `easeInOutCubic`. -->\r\n<script src=\"vendors/easings.min.js\"></script>\r\n\r\n<script type=\"text/javascript\" src=\"fullpage.js\"></script>\r\n```\r\n\r\nUsas Webpack, Browserify o Require.js? Mira [como usar fullPage.js con module loaders](https://github.com/alvarotrigo/fullPage.js/wiki/Use-module-loaders-for-fullPage.js).\r\n\r\n### Uso opcional de un CDN\r\nSi lo prefieres puedes hacer uso de un CDN (Content Delivery Network o Red de distribución de contenido) para cargar los archivos de fullPage.js. FullPage.js está disponible en [JSDelivr](https://www.jsdelivr.com/package/npm/fullpage.js), [UNPKG](https://unpkg.com/browse/fullpage.js/dist/), [CDNJS](https://cdnjs.com/libraries/fullPage.js)...\r\n\r\n### Estructura HTML requerida\r\nEl documento HTML requerirá comenzar con el [HTML DOCTYPE obligatorio](https://www.corelangs.com/html/introduction/doctype.html) en la primera línea de tu archivo HTML. De lo contrario puedes tener problemas con el tamaño de las secciones y diapositivas. Todos los ejemplos disponibles aquí usan la etiqueta HTML 5 `<!DOCTYPE html>`.\r\n\r\nCada sección se ha de definir usando la clase `section`.\r\nLa sección activa por defecto será la primera, que será tratada como la página de inicio.\r\n\r\nLas seciones tienen que estar contenidas en otro elemento (en este caso`<div id=\"fullpage\">`). El elemento contenedor no puede ser el elemento `body` de la página.\r\n\r\n```html\r\n<div id=\"fullpage\">\r\n\t<div class=\"section\">Sección 1</div>\r\n\t<div class=\"section\">Sección 2</div>\r\n\t<div class=\"section\">Sección 3</div>\r\n\t<div class=\"section\">Sección 4</div>\r\n</div>\r\n```\r\nSi quieres definir una sección de inicio diferente de la primera sección o la primera diapositiva de la sección, simplemente añade la clase `active` en la sección o diapositiva que quieras que sea visible inicialmente.\r\n```html\r\n<div class=\"section active\">Mi sección de inicio</div>\r\n```\r\nPuedes usar la clase `slide` para crear diapositivas horizontales dentro de una sección:\r\n```html\r\n<div class=\"section\">\r\n\t<div class=\"slide\"> Diapositiva 1 </div>\r\n\t<div class=\"slide\"> Diapositiva 2 </div>\r\n\t<div class=\"slide\"> Diapositiva 3 </div>\r\n\t<div class=\"slide\"> Diapositiva 4 </div>\r\n</div>\r\n````\r\nPuedes ver un ejemplo totalmente funcional de la estructura HTML en el ejemplo [`simple.html`](https://github.com/alvarotrigo/fullPage.js/blob/master/examples/simple.html).\r\n\r\n### Inicialización\r\nTodo lo que necesitas hacer es llamar a fullPage.js justo antes del cierre de la etiqueta `</body>`:\r\n```javascript\r\nvar myFullpage = new fullpage('#fullpage');\r\n```\r\n\r\n#### Inicialización con Vanilla Javascript\r\nTodo lo que necesitas hacer es llamar a fullPage.js justo antes de la etiqueta de cierre `</body>`.\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\t//options here\r\n\tautoScrolling:true,\r\n\tscrollHorizontally: true\r\n});\r\n```\r\n\r\n#### Inicialización con jQuery\r\nTambién puedes usar fullPage.js como plugin de jQuery!\r\n\r\n```javascript\r\n$(document).ready(function() {\r\n\t$('#fullpage').fullpage({\r\n\t\t// Options here\r\n\t\tautoScrolling:true,\r\n\t\tscrollHorizontally: true\r\n\t});\r\n\r\n\t// Example of how to use fullpage.js methods\r\n\tfullpage_api.setAllowScrolling(false);\r\n});\r\n```\r\n\r\n#### Ejemplo de inicialización Vanilla JS\r\n\r\nUna inizialización más compleja con todas las opciones definidas sería así:\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\t// Navegación\r\n\tmenu: '#menu',\r\n\tlockAnchors: false,\r\n\tanchors:['firstPage', 'secondPage'],\r\n\tnavigation: false,\r\n\tnavigationPosition: 'right',\r\n\tnavigationTooltips: ['firstSlide', 'secondSlide'],\r\n\tshowActiveTooltip: false,\r\n\tslidesNavigation: true,\r\n\tslidesNavPosition: 'bottom',\r\n\r\n\t// Desplazamiento\r\n\tcss3: true,\r\n\tscrollingSpeed: 700,\r\n\tautoScrolling: true,\r\n\tfitToSection: true,\r\n\tfitToSectionDelay: 600,\r\n\tscrollBar: false,\r\n\teasing: 'easeInOutCubic',\r\n\teasingcss3: 'ease',\r\n\tloopBottom: false,\r\n\tloopTop: false,\r\n\tloopHorizontal: true,\r\n\tcontinuousVertical: false,\r\n\tcontinuousHorizontal: false,\r\n\tscrollHorizontally: false,\r\n\tinterlockedSlides: false,\r\n\tdragAndMove: false,\r\n\toffsetSections: false,\r\n\tresetSliders: false,\r\n\tfadingEffect: false,\r\n\tnormalScrollElements: '#element1, .element2',\r\n\tscrollOverflow: true,\r\n\tscrollOverflowMacStyle: false,\r\n\tscrollOverflowReset: false,\r\n\ttouchSensitivity: 15,\r\n\tbigSectionsfDestination: null,\r\n\tadjustOnNavChange: true,\r\n\r\n\t// Accesibilidad\r\n\tkeyboardScrolling: true,\r\n\tanimateAnchor: true,\r\n\trecordHistory: true,\r\n\r\n\t// Diseno\r\n\tcontrolArrows: true,\r\n\tcontrolArrowsHTML: [\r\n\t\t'<div class=\"fp-arrow\"></div>', \r\n\t\t'<div class=\"fp-arrow\"></div>'\r\n\t],\r\n\tverticalCentered: true,\r\n\tsectionsColor : ['#ccc', '#fff'],\r\n\tpaddingTop: '3em',\r\n\tpaddingBottom: '10px',\r\n\tfixedElements: '#header, .footer',\r\n\tresponsiveWidth: 0,\r\n\tresponsiveHeight: 0,\r\n\tresponsiveSlides: false,\r\n\tcinematic: false,\r\n\tcinematicOptions: [Object],\r\n\teffects: false,\r\n\teffectsOptions: [Object],\r\n\tparallax: false,\r\n\tparallaxOptions: {type: 'reveal', percentage: 62, property: 'translate'},\r\n\tdropEffect: false,\r\n\tdropEffectOptions: { speed: 2300, color: '#F82F4D', zIndex: 9999},\r\n\twaterEffect: false,\r\n\twaterEffectOptions: { animateContent: true, animateOnMouseMove: true},\r\n\tcards: false,\r\n\tcardsOptions: {perspective: 100, fadeContent: true, fadeBackground: true},\r\n\r\n\t// Selectores personalizados\r\n\tsectionSelector: '.section',\r\n\tslideSelector: '.slide',\r\n\r\n\tlazyLoading: true,\r\n\tlazyLoadThreshold: 0,\r\n\tobserver: true,\r\n\tcredits: { enabled: true, label: 'Made with fullPage.js', position: 'right'},\r\n\r\n\t// Eventos\r\n\tbeforeLeave: function(origin, destination, direction, trigger){},\r\n\tonLeave: function(origin, destination, direction, trigger){},\r\n\tafterLoad: function(origin, destination, direction, trigger){},\r\n\tafterRender: function(){},\r\n\tafterResize: function(width, height){},\r\n\tafterReBuild: function(){},\r\n\tafterResponsive: function(isResponsive){},\r\n\tafterSlideLoad: function(section, origin, destination, direction, trigger){},\r\n\tonSlideLeave: function(section, origin, destination, direction, trigger){},\r\n\tonScrollOverflow: function(section, slide, position, direction){}\r\n});\r\n```\r\n\r\n### Crear enlaces a secciones y diapositivas\r\nSi usas fullPage.js con enlaces de anclaje para las secciones (haciendo uso de la opción `anchors` o del atributo `data-anchor` en cada sección), entonces también podrás usar los enlaces de anclaje para navegar a una sección o diapositiva en particular.\r\n\r\nEsto sería un ejemplo de un enlace con un enlace de anclaje: https://alvarotrigo.com/fullPage/#secondPage/2 (que es la URL que verás en la URL si accedes a esa sección/diapositiva manualmente).\r\nFíjate que la última parte de la URL termina en: `#secondPage/2`.\r\n\r\nTeniendo la siguiente inicialización:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors:['firstPage', 'secondPage', 'thirdPage']\r\n});\r\n```\r\n\r\nEl enlace de anclaje al final de la URL `#secondPage/2` define la sección y diapositiva de destino respectivamente. En la URL anterior, la sección de destino será la que está definida con el enlace de anclaje `secondPage` y la diapositiva será la segunda de dicha sección porque estamos usando el índice `2` para ella. La primera diapositiva de una sección tendrá índice 0, porque técnicamente será tratada como una sección.\r\n\r\nPodríamos haber usado un enlace de anclaje personalizado para la diapositiva en lugar de su índice si hubiésemos usado el atributo `data-anchor` en la estructura HTML:\r\n\r\n```html\r\n<div class=\"section\">\r\n\t<div class=\"slide\" data-anchor=\"slide1\"> Slide 1 </div>\r\n\t<div class=\"slide\" data-anchor=\"slide2\"> Slide 2 </div>\r\n\t<div class=\"slide\" data-anchor=\"slide3\"> Slide 3 </div>\r\n\t<div class=\"slide\" data-anchor=\"slide4\"> Slide 4 </div>\r\n</div>\r\n```\r\nEn este último caso, la URL que usaríamos sería `#secondPage/slide3`, que es la equivalente a nuestra URL anterior `#secondPage/2`.\r\n\r\nTen en cuenta que los enlaces de anclaje en la sección también pueden definirse del mismo modo, es decir, usando el atributo `data-anchor` siempre y cuando no hayamos definido la opción `anchors` al iniciar fullPage.js.\r\n\r\n**Ten cuidado!**, las etiquetas `data-anchor` no pueden tener el mismo valor que ninguna otra etiqueta ID en la página. (o `name` para Internet Explorer)\r\n\r\n### Crear secciones más pequeñas o más grandes\r\n[Demo](https://codepen.io/alvarotrigo/pen/BKjRYm) fullPage.js provee un modo de eliminar la restricción de pantalla completa para secciones y diapositivas. Es posible crear secciones con una altura menor o mayor que el tamaño de la ventana del navegador. Esto es especialmente útil para pies de página.\r\n\r\nPara crear este tipo de secciones simplemente usa la clase `fp-auto-height` en la sección donde quieres aplicarlo. De este modo fullPage.js ajustará el tamaño al dado por el contenido de dicha sección o diapositiva.\r\n\r\n```html\r\n<div class=\"section\">Ventana completa</div>\r\n<div class=\"section fp-auto-height\">Alto automático</div>\r\n```\r\n\r\n#### Secciones de tamaño automático y responsive\r\n[Demo](https://codepen.io/alvarotrigo/pen/MzByMa) Usando la clase `fp-auto-height-responsive` fullPage.js puede eliminar la restricción de pantalla completa únicamente bajo el modo `responsive` si asi lo deseas.\r\nDe este modo la sección pasará a ser una sección de tamaño automático cuando fullPage.js entre en modo responsive. (Usando la opcion `responsiveWidth` o `responsiveHeight`)\r\n\r\n### Classes de estado añadidas por fullpage.js\r\nFullpage.js añade multiples clases en diferentes elementos para reflejar el estado en el que se encuentra la página web:\r\n\r\n- `active` es añadido en la sección o diapositiva actual.\r\n- `active` es añadido en el elemento actual del menú (si se usa la opción `menu`)\r\n- `fp-loaded` se agrega al elemento de la sección o diapositiva que activa la carga diferida (lazy loading)del contenido multimedia.\r\n- Una clase con la forma `fp-viewing-SECCION-DIAPOSITIVA` es añadida al elemento `body` de la página. (ej: [`fp-viewing-secondPage-0`](https://alvarotrigo.com/fullPage/#secondPage)) Las partes de `SECCION` Y `DIAPOSITVA` serán los enlaces de anclaje (o los índices) de la sección o diapositiva actual.\r\n- `fp-responsive` es añadido al elemento `body` cuando se entra en modo \"responsive\".\r\n- `fp-enabled` es añadido al elemento `html` cuando fullPage.js está activo (y se elimina cuando se destruye).\r\n- `fp-destroyed` es añadido al contenedor usado para iniciar fullPage.js cuando se destruye fullPage.js.\r\n\r\n### Carga pasiva de elementos multimedia\r\n[Demo](https://codepen.io/alvarotrigo/pen/eNLBXo) fullPage.js provee un modo de cargar pasivamente imágenes, vídeos y audio de manera que dichos elementos no ralenticen la carga de la página web y gasten recursos de transferencia innecesarios.\r\nCuando se usa la carga pasiva de elementos, éstos solamente se cargarán cuando entren dentro de la parte visible de la ventana.\r\nPara activar esta funcionalidad bastará con cambiar el atributo `src` por `data-src` tal y como se muestra a continuación:\r\n\r\n```html\r\n<img data-src=\"image.png\">\r\n<video>\r\n\t<source data-src=\"video.webm\" type=\"video/webm\" />\r\n\t<source data-src=\"video.mp4\" type=\"video/mp4\" />\r\n</video>\r\n ```\r\nSi ya estabas usando otra librería de carga pasiva (lazy loading) que usa el atributo `data-src` también, puedes desactivar la carga pasiva de fullpage.js que está activa por defecto usando la opción `lazyLoading: false`.\r\n\r\n### Autoreproducir elementos multimedia\r\n\r\n[Demo](https://codepen.io/alvarotrigo/pen/pXEaaK) **Nota**: esta funcionalidad puede que no funcione en dispositivos móviles. Ésto dependerá del sistema operativo y del navegador usado.\r\n\r\n#### Reproducir al cargar la sección o diapositiva:\r\nUsando el atributo `autoplay` para videos y audios, o el parámetro `autoplay=1` para iframes de Youtube causará que el elemento empiece a reproducirse al cargar la página web.\r\nUsa el atributo `data-autoplay` para comenzar a reproducirlo cuando la sección o diapositiva a la que pertenece sea visible en la ventana. Por ejemplo:\r\n\r\n```html\r\n<audio data-autoplay>\r\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\r\n</audio>\r\n```\r\n\r\n#### Pausar al abandonar la sección o diapositiva\r\nLos elementos multimedia HTML 5 incrustados `<video>` / `<audio>` y los iframes de Youtube serán automáticamente pausados al abandonar la sección o diapositiva a la que pertenecen. Esto puede deshabilitarse usando el atributo `data-keepplaying`. Por ejemplo:\r\n```html\r\n<audio data-keepplaying>\r\n\t<source src=\"https://www.w3schools.com/html/horse.ogg\" type=\"audio/ogg\">\r\n</audio>\r\n```\r\n\r\n### Uso de extensiones\r\nfullPage.js [provee varias extensiones](https://alvarotrigo.com/fullPage/extensions/) que puedes usar para mejorar sus ya increíbles efectos. Todas las extensiones están la lista de [las opciones de fullPage.js](https://github.com/alvarotrigo/fullPage.js/blob/master/README_SPANISH.md#opciones)\r\n\r\nLas extensiones requieren el uso del archivo comprimido [`fullpage.extensions.min.js`](https://github.com/alvarotrigo/fullPage.js/blob/master/dist/fullpage.extensions.min.js) disponible [en la carpeta `dist`](https://github.com/alvarotrigo/fullPage.js/tree/master/dist) en lugar del archivo habitual de fullPage (`fullpage.js` o `fullpage.min.js`).\r\nUna vez que obtengas el archivo correspondiente a la extensión que deseas usar, tendrás que añadirlo antes del archivo de fullPage. Por ejemplo, si deseo usar la extensión Continuous Horizontal tendré que añadir el fichero de la extension y después el fichero de fullPage versión extensiones.\r\n\r\n```html\r\n<script type=\"text/javascript\" src=\"fullpage.continuousHorizontal.min.js\"></script>\r\n<script type=\"text/javascript\" src=\"fullpage/fullpage.extensions.min.js\"></script>\r\n```\r\n\r\nCada extensión requiere de una licencia y de una clave de activación. [Ver más detalles sobre el uso de licencias aquí](https://github.com/alvarotrigo/fullPage.js/blob/master/lang/spanish/how-to-activate-fullpage-extension.md).\r\n\r\nLuego podrás usar la extensión y configurarla tal y como se explica en las [opciones](https://github.com/alvarotrigo/fullPage.js/blob/master/README_SPANISH.md#opciones).\r\n\r\n## Opciones\r\n\r\n### licenseKey\r\n(por defecto `null`). **Esta opción es obligatoria.** Si usas fullPage.js en un proyecto que no sea código abierto, entonces tendrás que usar la clave de licencia que obtendrás al adquirir la licencia comercial de fullPage. Si tu proyecto es de código abierto y es compatible con la licencia GPLv3, puedes [solicitar una licencia](https://alvarotrigo.com/fullPage/extensions/requestKey.html) con un link a su repositorio para obtener una clave de licencia.\r\nPuedes leer más acerca de las licencias [aquí](https://github.com/alvarotrigo/fullPage.js#license) y en la [página web](https://alvarotrigo.com/fullPage/pricing/). Por ejemplo.\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tlicenseKey: 'YOUR_KEY_HERE'\r\n});\r\n```\r\n\r\n### controlArrows\r\n(por defecto `true`) Determina si usar flechas de control en las diapositivas para deslizar hacia la derecha o izquierda.\r\n\r\n### controlArrowsHTML\r\n(default `['<div class=\"fp-arrow\"></div>', '<div class=\"fp-arrow\"></div>'],`). Provides a way to define the HTML structure and the classes that you want to apply to the control arrows for sections with horizontal slides. The array contains the structure for both arrows. The first item is the left arrow and the second, the right one. (translation needed)\r\n\r\n### verticalCentered\r\n(por defecto `true`) centrado vertical de las secciones y diapositivas usando flexbox. You might want to wrap your content in a `div` to avoid potential issues. (Uses `flex-direction: column; display: flex; justify-content: center;`)\r\n\r\n### scrollingSpeed\r\n(por defecto `700`) Velocidad de deslizamiento en milisegundos.\r\n\r\n### sectionsColor\r\n(por defecto `none`) Define la propiedad CSS `background-color` para cada sección.\r\n\r\n\t```javascript\r\n\tnew fullpage('#fullpage', {\r\n\t\tsectionsColor: ['#f2f2f2', '#4BBFC3', '#7BAABE', 'whitesmoke', '#000'],\r\n\t});\r\n\t```\r\n\r\n### anchors\r\n(por defecto `[]`) Define los enlaces de anclaje (#ejemplo) que serán mostrados en la URL para cada sección. Los enlaces de anclaje deben ser únicos. La posición de los enlaces en el array definirá a qué sección serán aplicados. (la segunda posición será la segunda sección y así). Usar la navegación del navegador para moverse a la página anterior y siguiente será posible cuando se usen enlaces de anclaje. Éstos también ofrecen la posibilidad de guardar una sección o diapositiva específica a favoritos. **Ten cuidado!**: las etiquetas `data-anchor` no pueden tener el mismo valor que ninguna otra etiqueta ID en la página (o `name` para Internet Explorer).\r\nAhora los enlaces de anclaje también se pueden definir directamente en la estructura HTML usando el atributo `data-anchor`.\r\n\r\n### lockAnchors\r\n(por defecto `false`) Determina si los enlaces de anclaje en la URL tendrán efecto en fullPage.js. Puedes usar los `anchor` de manera interna para tus propias funciones o dento de los callbacks, pero no tendrán ningún efecto en el desplazamiento de la página web. Útiles cuando quieres combinar fullPage.js con otros plugins que usan enlaces de anclaje en la URL.\r\n\r\n### easing\r\n(por defecto `easeInOutCubic`) Define el tipo de transición que usará fullPage.js para el desplazamiento vertical y horizontal de la página cuando se usa `css3:false` o el navegador no soporta animaciones CSS3.\r\nRequiere el archivo `vendors/easings.min.js` o [jQuery UI](https://jqueryui.com/) para usar algunas de [sus transiciones](https://api.jqueryui.com/easings/)\r\nOtras librerías puede ser usadas si se desea.\r\n\r\n### easingcss3\r\n(por defecto `ease`) Define el efecto de transición que usará fullPage.js cuando se usa `css3:true`. Puedes usar los [efectos predefinidos](https://www.w3schools.com/cssref/css3_pr_transition-timing-function.asp) (como `linear`, `ease-out`...) o puedes crear tus propios efectos usando la función `cubic-bezier`. Puede que quieras ojear [Matthew Lein CSS Easing Animation Tool](https://matthewlein.com/ceaser/) para ello.\r\n\r\n### loopTop\r\n(por defecto `false`) Determina si hacer scroll hacia arriba estando en la primera sección te desplazará a la última o no.\r\n\r\n### loopBottom\r\n(por defecto `false`) Determina si hacer scroll hacia abajo estando en la última sección te desplazará a la primera o no.\r\n\r\n### loopHorizontal\r\n(por defecto `true`) Determina si las diapositivas horizontales volverán a la primera o última diapositiva al llegar a la última o primera respectivamente.\r\n\r\n### css3\r\n(por defecto `true`). Determina si fullPage.js usará JavasScript o animaciones CSS3 para realizar los desplazamientos entre secciones y diapositivas. Útil para mejorar el rendimiento en tabletas y dispositivos móviles así como en navegadores con soporte CSS3. Si esta opción se pone a `true` y el navegador no soporta animaciones CSS3, fullPage.js automáticamente lo volverá a poner a `false` para usar animaciones JavaScript.\r\n\r\n### autoScrolling\r\n(por defecto `true`) Determina si usar desplazamiento \"automático\" o \"a saltos\" o usar el desplazamiento tradicional de cualquier página. También afecta al modo en el que las secciones se ajustan a la ventana en tabletas y dispositivos móviles.\r\n\r\n### fitToSection\r\n(por defecto `true`) Determina si \"encajar\" las secciones en el navegador o no. Esto tiene sentido cuando se usa `autoScrolling:false` o `scrollBar:false` o el modo responsive. Cuando se usa `true` la sección actual se desplazará en la pantalla hasta llegar el contenido de la ventana usando. De lo contrario el usuario podrá desplazarse libremente y parar en mitad de 2 secciones.\r\n\r\n### fitToSectionDelay\r\n(por defecto `1000`). Si `fitToSection` está activo, esta opción define el tiempo en milisegundos que esperará fullpage.js desde que el usuario dejó de desplazarse hasta que la sección se encaja en la ventana.\r\n\r\n### scrollBar\r\n(por defecto `false`) Determina si se utiliza la barra de desplazamiento del navegador o no para las **secciones verticales**. En caso afirmativo, la funcionalidad de `autoScrolling` (de desplazamiento automático o \"a saltos\") funcionará como se espera. El usuario será también libre de desplazarse por la página usando la barra de navegación y fullpage.js encajará la sección cuando el desplazamiento cese siempre y cuando se use `fitToSection`.\r\n\r\n### paddingTop\r\n(por defecto `0`) Determina el \"padding\" superior para cada sección con un valor numérico y su unidad de medida (paddingTop: '10px', paddingTop: '10em'...). Útil cuando se usan cabeceras fijas (`fixed`).\r\n\r\n### paddingBottom\r\n(por defecto `0`) Determina el \"padding\" inferior para cada sección con un valor número y su unidad de medida (paddingBottom: '10px', paddingBottom: '10em'...) Útil cuando se usa un pie de página fijo (`fixed`).\r\n\r\n### fixedElements\r\n(por defecto `null`) Determina qué elementos serán extraídos de la estructura de fullPage.js. Cosa que es necesaria cuando se usa la opción `css3` para mantenerlos fijos (`fixed`). Requiere una cadena de texto con el selector de Javascript para dichos elementos. (Por ejemplo: `fixedElements: '#element1, .element2'`)\r\n\r\n### normalScrollElements\r\n(por defecto `null`) [Demo](https://codepen.io/alvarotrigo/pen/RmVazM) Si quieres evitar el auto desplazamiento (o desplazamiento a saltos) cuando se haga scroll encima de ciertos elementos, ésta es la opción a usar. (Útil para mapas, divs con scroll etc.). Requiere una cadena de texto con el selector de Javascript para dichos elementos.(Por ejemplo: `normalScrollElements: '#element1, .element2'`). Esta opción no debe ser aplicada directamente en las mismas secciones o diapositivas en sí, sino a elementos dentro de ellas.\r\n\r\n### bigSectionsDestination\r\n(por defecto `null`) [Demo](https://codepen.io/alvarotrigo/pen/vYLdMrx) Determina cómo desplazarse hacia una sección mayor que la ventana del navegador. Por defecto fullPage.js se desplazará hacia la parte superior de la sección si llegas desde una sección situada por encima y hacia la parte inferior si llegas desde una sección situada por debajo. Los posibles valores para esta opción son:  `top`, `bottom`, `null`. \r\n\r\n### adjustOnNavChange\r\n(por defecto `true`)\r\nDefine si fullPage.js ajusta la altura de las secciones cuando la barra de navegación o la barra de direcciones en móviles cambia de tamaño o alterna su visibilidad. Si se usa  `false`, las secciones no aparecerán con altura completa cuando la barra de navegación se reduzca o se oculte.\r\n\r\n### keyboardScrolling\r\n(por defecto `true`) Determina si el contenido puede ser navegado usando el teclado.\r\n\r\n### touchSensitivity\r\n(por defecto `5`) Determina cierto porcentaje de la ventana del navegador a partir del cual fullpage.js registra un desplazamiento vertical.\r\n\r\n### skipIntermediateItems\r\n(по умолчанию `false`). Определяет, следует ли пропускать анимацию прокрутки при навигации между неконсеквенционными вертикальными секциями или горизонтальными слайдами. Возможные значения: `true`, `false`, `sections` и `slides`, что позволяет применять это поведение по вертикали, горизонтали или в обоих направлениях.\r\n\r\n## skipIntermediateItems\r\n(por defecto `false`). Determina si se debe omitir la animación de desplazamiento al navegar entre secciones verticales o diapositivas horizontales no consecutivas. Los valores posibles son `true`, `false`, `sections` y `slides`, lo que permite aplicar este comportamiento de manera vertical, horizontal, o en ambas direcciones.\r\n\r\n### continuousVertical\r\n(por defecto `false`) Determina si hacer scroll hacia abajo en la última sección producirá un desplazamiento hacia abajo hacia la primera sección o no, y si hacer scroll hacia arriba en la primera sección producirá un desplazamiento hacia arriba hacia la última sección. No es compatible con `loopTop`, `loopBottom` y ninguna barra de desplazamiento (usando `scrollBar:true` o `autoScrolling:false`).\r\n\r\n### continuousHorizontal\r\n(por defecto `false`) [Extensión de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Determina si desplazarse hacia la derecha en la última diapositiva causará un desplazamiento hacia la derecha hacia la primera diapositiva, y si desplazarse hacia la izquierda en la primera diapositiva causará un desplazamiento hacia la izquierda hacia la última diapositiva. No es compatible con `loopHorizontal`.\r\n\r\n### scrollHorizontally\r\n(por defecto `false`) [Extensión de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Determina si desplazarse horizontalmente entre las diapositivas de la sección cuando se usa la ruleta del ratón o el trackpad. Sólamente funciona cuando se usa `autoScrolling:true`. Ideal para contar historias.\r\n\r\n### interlockedSlides\r\n(por defecto  `false`) [Extensión de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Determina si al moverse horizontalmente una sección con diapositivas, ésto forzará el movimiento de otras diapositivas en otras secciones en la misma dirección. Los posibles valores son `true`, `false` o un array con las secciones que estarán interconectadas. Por ejemplo `[1,3,5]` empezando por 1.\r\n\r\n### dragAndMove\r\n(por defecto `false`) [Extensión de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Habilita o deshabilita el desplazamiento de secciones y diapositivas usando el ratón o los dedos en dispositivos táctiles. Los posibles valores para esta opción son:\r\n  - `true`: habilita la función.\r\n  - `false`: deshabilita la función.\r\n  - `vertical`: habilita la funcion sólo verticalmente.\r\n  - `horizontal`: habilita la funcion sólo horizontalmente.\r\n  - `fingersonly`: habilita la función sólo para dispositivos táctiles.\r\n  - `mouseonly`: habilita la función sólo para ratón y trackpad (desktop).\r\n\r\n### offsetSections\r\n(por defecto `false`)[Extensión de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Provee una manera de usar secciones que no toman la pantalla completa sino un porcentaje determinado de la misma. Ideal para mostrar a los visitantes que hay más contenido en la página mostrando parte de sección siguiente o anterior.\r\nPara definir el porcentaje de la sección hay que hacer uso del atributo `data-percentage`. El centrado de la sección en la ventana puede definirse usando un valor booleano (true o false) en el atributo `data-centered`. (Por defecto será `true` si no se especifica). Por ejemplo:\r\n\r\n\t``` html\r\n\t<div class=\"section\" data-percentage=\"80\" data-centered=\"true\">\r\n\t```\r\n\r\n### resetSliders\r\n(por defecto `false`). [Extensión de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Determina cuando reiniciar el carrusel de diapositivas de la sección al salir de ella, de modo que muestre la primera diapositiva cuando se vuelva a dicha sección.\r\n\r\n### fadingEffect\r\n(por defecto `false`). [Extensión de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Determina cuando usar el efecto de desvanecimiento (fading) en lugar del efecto de desplazamiento habitual de fullPage.js. Los posibles valores son `true`, `false` `sections`, `slides`. Puede por lo tanto, aplicarse únicamente vertical u horizontalmente o ambos al tiempo.\r\n\r\n### animateAnchor\r\n(por defecto `true`) Determina si al cargar la página usando un enlace de anclaje (#) ésta se desplazará a la sección de destino o si por el contrario cargará la página directamente en dicha sección.\r\n\r\n### recordHistory\r\n(por defecto `true`) Determina si el estado de la página se guardará en la historia del navegador. Cuando se define la opción a `true` cada sección/diapositiva de la página actuará como una nueva página y el botón de \"página anterior\" o \"página siguiente\" del navegador desplazará las secciones/diapositivas de la página hasta alcanzar el estado de la página anterior o siguiente respectivamente. Cuando se define la opción a `false`, la URL seguirá cambiando con los enlaces de anclaje correspondientes pero no tendrán ningún efecto en la historia del navegador. Esta opción está automáticamente definida como `false` cuando se usa la opción `autoScrolling:false`.\r\n\r\n### menu\r\n(por defecto `false`) Se puede usar un selector para especificar el menú de la página al que las secciones hacen referencia. De este modo, el desplazamiento vertical entre las secciones activará el elemento correspondiente del menú usando la clase `active`.\r\nEsta opción no generará ningún menú, sino que simplemente añade la clase `active` al elemento del menú con el enlace de anclaje correspondiente a la sección.\r\nPara relacionar los elementos del menú con las secciones se requiere del uso del atributo `data-menuanchor` que tendrá que tener el mismo valor que el enlace de anclaje que la sección a la que haga referencia. Por ejemplo:\r\n\r\n```html\r\n<ul id=\"myMenu\">\r\n\t<li data-menuanchor=\"firstPage\" class=\"active\"><a href=\"#firstPage\">First section</a></li>\r\n\t<li data-menuanchor=\"secondPage\"><a href=\"#secondPage\">Second section</a></li>\r\n\t<li data-menuanchor=\"thirdPage\"><a href=\"#thirdPage\">Third section</a></li>\r\n\t<li data-menuanchor=\"fourthPage\"><a href=\"#fourthPage\">Fourth section</a></li>\r\n</ul>\r\n```\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\r\n\tmenu: '#myMenu'\r\n});\r\n```\r\n\r\n**Nota:** el menú tiene que estar situado fuera del contenedor de fullpage para evitar problemas cuando se use `css3:true`. De lo contrario, el menú será automáticamente movido fuera de la estructura de fullPage.js y añadido en el `body`.\r\n\r\n### navigation\r\n(por defecto `false`) Si se define a `true`, se mostrará una navegación lateral de círculos haciendo referencia a las secciones de la página.\r\n\r\n### navigationPosition\r\n(por defecto `none`) Puede ser definido a `left` o `right` y determina la posición que tomará la navegación (si es que se usa).\r\n\r\n### navigationTooltips\r\n(por defecto `[]`) Determina el texto para usar en cada círculo de la navegación. Por ejemplo:  `navigationTooltips: ['firstSlide', 'secondSlide']`. También puedes definir dichos textos usando el atributo `data-tooltip` en cada sección si así lo prefieres.\r\n\r\n### showActiveTooltip\r\n(por defecto `false`) Determina si mostrar siempre visible el texto para el círculo de la navegación que se encuentre activo en ese momento.\r\n\r\n### slidesNavigation\r\n(por defecto `false`) Si se define a `true` mostrará la navegación para las diapositivas horizontales de la página.\r\n\r\n### slidesNavPosition\r\n(por defecto `bottom`) Determina la posición que tomará la navegación para las diapositivas horizontales de la página. Admite los valores `top` y `bottom`. Tal vez quieras modificar la distancia inferior o superior usando estilos CSS así como el color de los mismos.\r\n\r\n### scrollOverflow\r\n(por defecto `true`) Determina si crear o no una barra de desplazamiento para las secciones/diapositivas donde el contenido de las mismas sea mayor que la altura de la ventana del navegador. Requiere la opciión por defecto `scrollBar:false`. Para evitar que fullPage.js cree la barra de desplazamiento en ciertas secciones o diapositivas, haz uso de la clase `fp-noscroll`. Por ejemplo: `<div class=\"section fp-noscroll\">`. Puedes evitar que `scrolloverflow` se aplique en modo responsive si usas la clase `fp-auto-height-responsive` en la sección. [Más información](https://github.com/alvarotrigo/fullPage.js#responsive-auto-height-sections).\r\n\r\n### scrollOverflowMacStyle\r\n(default `false`). When active, this option will use a \"mac style\" for the scrollbar instead of the default one, which will look quite different in Windows computers. (translation needed)\r\n\r\n### scrollOverflowReset\r\n(por defecto `false`) [Extensión de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Cuando se define a `true` fullPage.js moverá el contenido de la seccion o diapositiva hacia arriba cuando se abandone la seccion o diapositiva hacia otra sección vertical. De este modo, cuando se llega a una sección que usa barra de desplazamiento, se mostrará siempre el principio de su contenido. Possible values are `true`, `false`, `sections`, `slides`.Adding the class `fp-no-scrollOverflowReset` on the section or slide will disable this feature for that specific panel.\r\n\r\n### sectionSelector\r\n(por defecto `.section`) Determina el selector Javascript que fullPage.js usará para determinar lo que es una sección. Puede que necesites cambiarlo para evitar problemas con otras librerías que usen el mismo selector que usa fullPage.js por defecto.\r\n\r\n### slideSelector\r\n(por defecto `.slide`) Determina el selector de Javascript que fullPage.js usará para determinar lo que es una diapositiva. Puede que necesites cambiarlo para evitar problemas con otras librerías que usen el mismo selector que usa fulPage.js por defecto.\r\n\r\n### responsiveWidth\r\n(por defecto `0`) Usará el desplazamiento por defecto de cualquier otra página cuando la ventana tenga un valor de `anchor` menor que el definido en esta opción. La clase `fp-resposive` será añadida al elemento `body` de página en caso de que quieras usar dicho selector en tu hoja de estilos CSS para determinar cuando fullpage.js ha entrado en modo responsive. Por ejemplo, si se define como `900`, cuando la ventana del navegador sea menor que 900 píxeles el desplazamiento de fullpage.js actuará como en una página normal.\r\n\r\n### responsiveHeight\r\n(por defecto `0`) Usará el desplazamiento por defecto de cualquier otra página cuando la ventana tenga un valor de altura menor que el definido en esta opción. La clase `fp-resposive` será añadida al elemento `body` de página en caso de que quieras usar dicho selector en tu hoja de estilos CSS para determinar cuando fullpage.js ha entrado en modo responsive. Por ejemplo, si se define como `900`, cuando la ventana del navegador sea menor que 900 píxeles, el desplazamiento de fullpage.js actuará como en una página normal.\r\n\r\n### responsiveSlides\r\n(por defecto `false`) [Extensión de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Cuando se define a `true` las diapositivas horizontales se convertirán en secciones verticales cuando el modo responsive se active (haciendo uso de las opciones `responsiveWith` o `responsiveHeight` detalladas arriba).\r\n\r\n### cinematic\r\n\r\n(por defecto `false`) [Extensión de fullpage.js](https://alvarotrigo.com/fullPage/extensions/cinematic.html). Activa o desactiva los efectos cinematic en las secciones. Requiere fullpage.js >= 4.0.41.\r\n\r\n### cinematicOptions\r\n\r\n(por defecto: `{Object}`) Permite configurar los parámetros de la animación del contenido cuando se utiliza la opción `cinematic:true`. [Leer más](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cinematic-Effects#cinematicoptions).\r\n\r\n### effects\r\n(por defecto: `false`) [Extensión de fullpage.js](https://alvarotrigo.com/fullPage/extensions/slider-effects.html). Activa o desactiva los efectos de deslizamiento en las secciones. Requiere fullpage.js >= 4.0.35\r\n\r\n### effectsOptions\r\n(por defecto: `{Object}`, configuración del preset [\"focus\"](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#20-available-presetss)).  \r\nPermite configurar los parámetros de los efectos cuando se usa la opción `effects:true`. [Leer más sobre cómo aplicar la opción effects](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Slide-Effects#effects-options-documentation)\r\n\r\n### parallax\r\n(por defecto `false`) [Extensión de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Determina si usar fondos de sección y diapositiva con efecto parallax o no. [Lee más acerca de la opción parallax aquí](https://github.com/alvarotrigo/fullPage.js/blob/master/lang/spanish/parallax-extension.md).\r\n\r\n### parallaxOptions\r\n(por defecto: `{ type: 'reveal', percentage: 62, property: 'translate'}`). \r\nPermite configurar los parámetros para el efecto de parallax cuando se usa la opción `parallax:true`. [Lee más acerca de la opción parallax aquí](https://github.com/alvarotrigo/fullPage.js/blob/master/lang/spanish/parallax-extension.md).\r\n\r\n### dropEffect\r\n(default `false`) [Extensión de fullpage.jss](https://alvarotrigo.com/fullPage/extensions/). Determinar si usar el efecto \"drop\" para secciones y slides. [Lee más acerca de la opción de dropEffect aquí](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect).\r\n\r\n### dropEffectOptions\r\n(default: `{ speed: 2300, color: '#F82F4D', zIndex: 9999}`). \r\nPermite configurar los parámetros para el efecto drop cuando se usa la option `dropEffect:true`.[Lee más acerca de la opción de dropEffect aquí](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Drop-Effect).\r\n\r\n### waterEffect\r\n(default `false`) [Extensión de fullpage.jss](https://alvarotrigo.com/fullPage/extensions/). Determinar si usar el efecto \"Water\" (agua) para secciones y slides. [Lee más acerca de la opción de dropEffect aquí](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect).\r\n\r\n### waterEffectOptions\r\n(default: `{ animateContent: true, animateOnMouseMove: true}`). \r\nPermite configurar los parámetros para el efecto \"Water\" (agua) cuando se usa la option `waterEffect:true`.[Lee más acerca de la opción de dropEffect aquí](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Water-Effect).\r\n\r\n### cards\r\n(default `false`) [Extension de fullpage.js](https://alvarotrigo.com/fullPage/extensions/). Determina si usar el efecto de \"Cards\" en secciones/diapositivas. [Lee más acerca de la opción cards aquí](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards).\r\n\r\n### cardsOptions\r\n(default: `{ perspective: 100, fadeContent: true, fadeBackground: true}`). \r\nPermite configurar los parámetros para el efecto de Cards cuando se usa la opcón `cards:true`. [Lee más acerca de la opción cards aquí](https://github.com/alvarotrigo/fullPage.js/wiki/Extension-Cards).\r\n\r\n### lazyLoading\r\n(por defecto `true`) La carga pasiva está activa por defecto, lo que significa que cargará pasivamente cualquier elemento multimedia que contenga el atributo `data-src` como se detalla en la [carga pasiva de elementos multimedia](https://github.com/alvarotrigo/fullPage.js/blob/master/README_SPANISH.md#carga-pasiva-de-elementos-multimedia). Si quieres usar otra librería de carga pasiva puedes deshabilitar esta funcionalidad usando `false`.\r\n\r\n### lazyLoadThreshold\r\n(por defecto `0`) Especifica el número de secciones verticales adyacentes y diapositivas horizontales cuyos elementos multimedia deben cargarse dinámicamente en relación con la actual. Usa un número para especificar cuántas secciones o diapositivas anteriores y siguientes deben precargarse.\r\n\r\n### observer\r\n(default `true`) Defines whether or not to observe changes in the HTML structure of the page. When enabled, fullPage.js will automatically react to those changes and update itself accordingly. Ideal when adding, removing or hidding sections or slides. (translation needed)\r\n\r\n### credits\r\n(default `{enabled: true, label: 'Made with fullpage.js', position: 'right'}`). \r\nDefines whether to use fullPage.js credits. As per clause 0, 4, 5 and 7 of the GPLv3 licecense, those using fullPage.js under the GPLv3 are required to give prominent notice that fullPage.js is in use. We recommend including attribution by keeping this option enabled. (translation needed). **Nota:** Esta opción requiere un valor válido en `licenseKey`.\r\n\r\n## Métodos\r\nPuedes verlos en acción [aquí](https://alvarotrigo.com/fullPage/examples/methods.html)\r\n\r\n\r\n### getActiveSection()\r\n[Demo](https://codepen.io/alvarotrigo/pen/VdpzRN/) Gets an Object (type [Section](https://github.com/alvarotrigo/fullPage.js#callbacks)) containing the active section and its properties.\r\n\r\n```javascript\r\nfullpage_api.getActiveSection();\r\n```\r\n\r\n### getActiveSlide()\r\n[Demo](https://codepen.io/alvarotrigo/pen/VdpzRN/) Gets an Object (type [Slide](https://github.com/alvarotrigo/fullPage.js#callbacks)) containing the active slide and its properties.\r\n\r\n```javascript\r\nfullpage_api.getActiveSlide();\r\n```\r\n\r\n### getScrollY() & getScrollX\r\n[Demo](https://codepen.io/alvarotrigo/pen/GRyGqro) `getScrollY` Gets the Y position of the fullPage wrapper. `getScrollX` gets the X position of the active horizontal slide.\r\n\r\n```javascript\r\nfullpage_api.getScrollY();\r\nfullpage_api.getScrollX();\r\n```\r\n\r\n### moveSectionUp()\r\n[Demo](https://codepen.io/alvarotrigo/pen/GJXNMN) Desplaza la página hacia arriba una sección:\r\n```javascript\r\nfullpage_api.moveSectionUp();\r\n```\r\n---\r\n### moveSectionDown()\r\n[Demo](https://codepen.io/alvarotrigo/pen/jPvVZx) Desplaza la página hacia abajo una sección:\r\n```javascript\r\nfullpage_api.moveSectionDown();\r\n```\r\n---\r\n### moveTo(section, slide)\r\n[Demo](https://codepen.io/alvarotrigo/pen/doqOmY) Desplaza la página hacia la sección o diapositiva que se le indique. La primera diapositiva en una sección, que es la visible por defecto, tendrá índice 0.\r\n```javascript\r\n/* Desplazando la página a la sección con el enlace de anclaje `firstSlide` y a la diapositiva número 2*/\r\nfullpage_api.moveTo('firstSlide', 2);\r\n```\r\n\r\n```javascript\r\n//Desplazándo a la tercera sección de la página\r\nfullpage_api.moveTo(3, 0);\r\n\r\n//Que sería lo mismo que hacer esto\r\nfullpage_api.moveTo(3);\r\n```\r\n---\r\n### silentMoveTo(section, slide)\r\n[Demo](https://codepen.io/alvarotrigo/pen/doqOeY)\r\nExactamente lo mismo que [`moveTo`](https://github.com/alvarotrigo/fullPage.js/blob/master/README_SPANISH.md#movetosection-slide) pero en este caso el desplazamiento se hará sin animación. Un salto directo al destino sin transición.\r\n```javascript\r\n/* Desplzando la página a la sección con el link the anclaje `firstSlide` y a la diapositiva numero 2*/\r\nfullpage_api.silentMoveTo('firstSlide', 2);\r\n```\r\n---\r\n### moveSlideRight()\r\n[Demo](https://codepen.io/alvarotrigo/pen/Wvgoyz)\r\nDesplaza el carrusel de diapostivas de la sección actual hacia la siguiente diapositiva.\r\n```javascript\r\nfullpage_api.moveSlideRight();\r\n```\r\n---\r\n### moveSlideLeft()\r\n[Demo](https://codepen.io/alvarotrigo/pen/gpdLjW)\r\nDesplaza el carrusel de diapositivas de la sección actual hacia la diapositiva anterior.\r\n```javascript\r\nfullpage_api.moveSlideLeft();\r\n```\r\n---\r\n### setAutoScrolling(boolean)\r\n[Demo](https://codepen.io/alvarotrigo/pen/rVZWrR) Permite definir la configuración de la opción `autoScrolling` después de la inicialización.\r\nDetermina si usar desplazamiento \"automático\" o \"a saltos\" o usar el desplazamiento tradicional de cualquier página.\r\n\r\n```javascript\r\nfullpage_api.setAutoScrolling(false);\r\n```\r\n---\r\n### setFitToSection(boolean)\r\n[Demo](https://codepen.io/alvarotrigo/pen/GJXNYm)\r\nDetermina el valor para la opción `fitToSection` definiendo si ajustar la sección más cercana a la pantalla o no.\r\n\r\n```javascript\r\nfullpage_api.setFitToSection(false);\r\n```\r\n---\r\n### fitToSection()\r\n[Demo](https://codepen.io/alvarotrigo/pen/JWWagj)\r\nDesplaza la página hacia la sección activa más cercana encajándola en la pantalla.\r\n\r\n```javascript\r\nfullpage_api.fitToSection();\r\n```\r\n---\r\n### setLockAnchors(boolean)\r\n[Demo](https://codepen.io/alvarotrigo/pen/yNxVRQ)\r\nDefine el valor para la opción `lockAnchors` determinando si los enlaces de anclaje tendrán algún efecto en la URL o no.\r\n\r\n```javascript\r\nfullpage_api.setLockAnchors(false);\r\n```\r\n---\r\n### setAllowScrolling(boolean, [directions])\r\n[Demo](https://codepen.io/alvarotrigo/pen/EjeNdq)\r\nAñade o elimina la posibilidad de desplazarse a través de las secciones o diapositivas usando la ruleta del ratón, el trackpad del portátil o con los dedos en dispositivos táctiles. Ten en cuenta que ésto no deshabilitará el desplazamiento usando el teclado. Para ello necesitarás hacer uso de `setKeyboardScrolling`.\r\n\r\n- `directions`: (parámetro opcional) Los posibles valores son `all`, `up`, `down`, `left`, `right` o una combinación de lo mismos usando comas, por ejemplo: `down, right`. Determina la dirección para la que el desplazamiento estará habilitado o deshabilitado.\r\n\r\n```javascript\r\n\r\n//desabilitando cualquier tipo de desplazamiento\r\nfullpage_api.setAllowScrolling(false);\r\n\r\n//desabilitando desplazamiento hacia abajo\r\nfullpage_api.setAllowScrolling(false, 'down');\r\n\r\n//desabilitando desplazamiento hacia abajo y hacia la derecha\r\nfullpage_api.setAllowScrolling(false, 'down, right');\r\n```\r\n---\r\n### setKeyboardScrolling(boolean, [directions])\r\n[Demo](https://codepen.io/alvarotrigo/pen/GJXNwm) Añade o elimina la posibilidad de desplazarse a través de las secciones usando las teclas del teclado (activo por defecto).\r\n\r\n- `directions`: (parámetro opcional) Los posibles valores son `all`, `up`, `down`, `left`, `right` o una combinación de los mismos usando comas, por ejemplo: `down, right`. Determina la dirección para la que el desplazamiento estará habilitado o deshabilitado.\r\n\r\n```javascript\r\n//deshabilitando todo tipo de desplazamiento con el teclado\r\nfullpage_api.setKeyboardScrolling(false);\r\n\r\n//deshabilitando el desplazamiento hacia abajo con el teclado\r\nfullpage_api.setKeyboardScrolling(false, 'down');\r\n\r\n//deshabilitando el desplazamiento hacia abajo y hacia la derecha con el teclado\r\nfullpage_api.setKeyboardScrolling(false, 'down, right');\r\n```\r\n---\r\n### setRecordHistory(boolean)\r\n[Demo](https://codepen.io/alvarotrigo/pen/rVZWQb) Determina si fullPage.js modificará la historia del navegador con cada cambio de enlace de anclaje (#) en la URL.\r\n\r\n```javascript\r\nfullpage_api.setRecordHistory(false);\r\n```\r\n---\r\n### setScrollingSpeed(milliseconds)\r\n[Demo](https://codepen.io/alvarotrigo/pen/NqLbeY) Define la velocidad de desplazamiento en milisegundos.\r\n\r\n```javascript\r\nfullpage_api.setScrollingSpeed(700);\r\n```\r\n---\r\n### destroy(type)\r\n[Demo](https://codepen.io/alvarotrigo/pen/bdxBzv) Destruye los eventos de fullPage.js y opcionalmente la estructura HTML creada por el mismo así como cualquier estilo que haya aplicado.\r\nIdeal para usar cuando se usa en páginas AJAX.\r\n\r\n- `type`: (parámetro opcional) Si se define como `all` la estructura HTML creada por fullPage.js así como cualquier estilo que haya aplicado serán eliminados. De este modo, se mantendrá el HTMl original, es decir, el usado antes de que fullPage.js se iniciase.\r\n\r\n```javascript\r\n//destrozando los eventos Javascript de fullPage.js (scrolls, hashchange in the URL...)\r\nfullpage_api.destroy();\r\n\r\n//destrozando los eventos Javascript asi como cualquier modificación en el HTML hecha tras iniciar fullPage.js\r\nfullpage_api.destroy('all');\r\n```\r\n---\r\n### reBuild()\r\nAjusta el tamaño de las secciones y diapositivas así como su posición y su posible barra de desplazamiento si se usa `scrollOverflow:true`.\r\nIdeal para usar en combinación con llamadas AJAX o cambios externos en la estructura DOM de la página, especialmente cuando se usa `scrollOverflow:true`.\r\n\r\n```javascript\r\nfullpage_api.reBuild();\r\n```\r\n---\r\n### setResponsive(boolean)\r\n[Demo](https://codepen.io/alvarotrigo/pen/WxOyLA) Define el modo \"responsive\". Cuando se define a `true` la funcionalidad de `autoScrolling` será desactivada tal y como sucedería si se disparasen las opciones `responsiveWidth` o `responsiveHeight`.\r\n\r\n```javascript\r\nfullpage_api.setResponsive(true);\r\n```\r\n---\r\n### responsiveSlides.toSections()\r\n[Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/).\r\nConvierte diapositivas horizontales en secciones verticales.\r\n\r\n```javascript\r\nfullpage_api.responsiveSlides.toSections();\r\n```\r\n---\r\n### responsiveSlides.toSlides()\r\n[Extension of fullpage.js](https://alvarotrigo.com/fullPage/extensions/).\r\nDeshace el cambio de las diapositivas horizontales que han sido convertidas a secciones verticales, dejándolas nuevamente como diapositivas horizontales dentro de una sección.\r\n\r\n```javascript\r\nfullpage_api.responsiveSlides.toSlides();\r\n```\r\n\r\n## Callbacks\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Puedes verlas en acción [aquí](https://alvarotrigo.com/fullPage/examples/callbacks.html).\r\n\r\nAlgunos eventos de callback, como `onLeave`, contienen Objectos como parámetros. Dichos objetos son de tipo Section o Slide y continen las siguientes propiedades:\r\n\r\n- `anchor`: *(String)* link de anclaje.\r\n- `index`: *(Number)* índice.\r\n- `item`: *(DOM element)* elemento DOM.\r\n- `isFirst`: *(Boolean)* determina si el elemento es el primero de su tipo.\r\n- `isLast`: *(Boolean)* determina si el elemento es el último de su tipo.\r\n\r\n### afterLoad (`origin`, `destination`, `direction`, `trigger`)\r\nSe dispara cuando una sección ha sido cargada completamente en la ventana, una vez que el desplazamiento ha terminado.\r\nParámetros:\r\n\r\n- `origin`: *(Object)* sección de origin.\r\n- `destination`: *(Object)* sección de destino.\r\n- `direction`: *(String)* `up` o `down` dependiendo de la dirección de desplazamiento.\r\n\r\nPor ejemplo:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\r\n\r\n\tafterLoad: function(origin, destination, direction, trigger){\r\n\t\tvar origin = this;\r\n\r\n\t\t//usando su índice\r\n\t\tif(destination.index == 2){\r\n\t\t\talert(\"Section 3 ended loading\");\r\n\t\t}\r\n\r\n\t\t//usando su link de anclaje\r\n\t\tif(destination.anchor == 'secondSlide'){\r\n\t\t\talert(\"Section 2 ended loading\");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n---\r\n### onLeave (`origin`, `destination`, `direction`, `trigger`)\r\nSe dispara una vez que el usuario abandona la sección, durante la transición a la nueva sección.\r\nSi devuelves `false` el movimiento se cancelará antes de que tenga lugar.\r\n\r\nParámetros:\r\n\r\n- `origin`: *(Object)* sección de origin.\r\n- `destination`: *(Object)* sección de destino.\r\n- `direction`: *(String)* `up` o `down` dependiendo de la dirección de desplazamiento.\r\n\r\nPor ejemplo:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tonLeave: function(origin, destination, direction, trigger){\r\n\t\tvar origin = this;\r\n\r\n\t\t//después de abandonar la sección 2\r\n\t\tif(origin.index == 1 && direction =='down'){\r\n\t\t\talert(\"Me estoy moviendo a la sección 3!\");\r\n\t\t}\r\n\r\n\t\telse if(origin.index == 1 && direction == 'up'){\r\n\t\t\talert(\"Me estoy moviendo a la sección 1!\");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n\r\n---\r\n### beforeLeave (`origin`, `destination`, `direction`, `trigger`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback is fired right **before** leaving the section, just before the transition takes place.\r\n\r\nYou can use this callback to prevent and cancel the scroll before it takes place by returning `false`.\r\n\r\nParameters:\r\n\r\n- `origin`:  *(Object)* section of origin.\r\n- `destination`: *(Object)* destination section.\r\n- `direction`: *(String)* it will take the values `up` or `down` depending on the scrolling direction.\r\n- `trigger`: *(String)* indicates what triggered the scroll. It can be: \"wheel\", \"keydown\", \"menu\", \"slideArrow\", \"verticalNav\", \"horizontalNav\".\r\n\r\nExample:\r\n\r\n```javascript\r\n\r\nvar cont = 0;\r\nnew fullpage('#fullpage', {\r\n\tbeforeLeave: function(origin, destination, direction, trigger){\r\n\r\n\t\t// prevents scroll until we scroll 4 times\r\n\t\tcont++;\r\n\t\treturn cont === 4;\r\n\t}\r\n});\r\n```\r\n\r\n---\r\n### afterRender()\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Será disparado justo después de que la estructura de la página sea generada por fullPage.js. Este callback es útil si quieres iniciar otros plugins o ejecutar cualquier otro código que requiera que la estructura de la página esté lista (ready). fullPage.js modifica la estructura DOM de la página y por lo tanto puede que los elementos en la página se consideren dinámicos. Mira [las FAQs](https://github.com/alvarotrigo/fullPage.js/wiki/FAQ---Frequently-Answered-Questions) para más información.\r\n\r\nEjemplo:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterRender: function(){\r\n\t\tvar pluginContainer = this;\r\n\t\talert(\"La estructura resultante ya está lista para su uso\");\r\n\t}\r\n});\r\n```\r\n---\r\n### afterResize(`width`, `height`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Será disparado después de que la ventana del navegador sea reajustada en tamaño. Justo después de que las secciones se hayan reajustado.\r\n\r\nParámetros:\r\n\r\n- `width`:  *(Number)* ancho de ventana.\r\n- `height`: *(Number)* alto de ventana.\r\n\r\nEjemplo:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterResize: function(width, height){\r\n\t\tvar pluginContainer = this;\r\n\t\talert(\"Las secciones han terminado de reajustarse\");\r\n\t}\r\n});\r\n```\r\n---\r\n### afterReBuild()\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Será dispardo después de reajustar fullPage.js de manera manual usando `fullpage_api.reBuild()`.\r\n\r\nExample:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterReBuild: function(){\r\n\t\tconsole.log(\"fullPage.js has manually being re-builded\");\r\n\t}\r\n});\r\n```\r\n---\r\n### afterResponsive(`isResponsive`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Será disparado después de que fullPage.js cambie de su estado normal a \"responsive\" o viceversa.\r\n\r\nParámetros:\r\n\r\n- `isResponsive`: booleano que determina si entra (`true`) o sale (`false`) del modo \"responsive\" hacia su modo normal.\r\n\r\nEjemplo:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tafterResponsive: function(isResponsive){\r\n\t\talert(\"Es responsive: \" + isResponsive);\r\n\t}\r\n});\r\n```\r\n---\r\n### afterSlideLoad (`section`, `origin`, `destination`, `direction`, `trigger`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Será disparado una vez cargue la diapositiva de una sección, después que el desplazamiento haya terminado.\r\n\r\nParámetros:\r\n\r\n- `section`: *(Object)* sección activa.\r\n- `origin`: *(Object)* diapositiva de origen.\r\n- `destination`: *(Object)* diapositiva de destino.\r\n- `direction`: *(String)* `right` or `left` depending on the scrolling direction.\r\n\r\nEjemplo:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tanchors: ['firstPage', 'secondPage', 'thirdPage', 'fourthPage', 'lastPage'],\r\n\r\n\tafterSlideLoad: function( section, origin, destination, direction, trigger){\r\n\t\tvar loadedSlide = this;\r\n\r\n\t\t//primera diapositiva de la segunda sección\r\n\t\tif(section.anchor == 'secondPage' && destination.index == 1){\r\n\t\t\talert(\"Primera diapositiva cargada\");\r\n\t\t}\r\n\r\n\t\t//segunda diapositiva de la segunda sección (suponiendo que #secondSlide es\r\n\t\t//el enlace de anclaje de la segunda diapositiva\r\n\t\tif(section.index == 1 && destination.anchor == 'secondSlide'){\r\n\t\t\talert(\"Segunda diapositiva cargada\");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n\r\n\r\n---\r\n### onSlideLeave (`section`, `origin`, `destination`, `direction`, `trigger`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) Será disparado una vez que el usuario abandone la diapositiva actual para ir a otra, durante la transición hacia la nueva diapositiva.\r\nDevolver `false`.\r\nSi devuelves `false`, el movimiento se cancelará antes de que tenga lugar.\r\n\r\nParámetros:\r\n\r\n- `section`: *(Object)* sección activa.\r\n- `origin`: *(Object)* diapositiva de origen.\r\n- `destination`: *(Object)* diapositiva de destino.\r\n- `direction`: *(String)* `right` or `left` depending on the scrolling direction.\r\n\r\nEjemplo:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tonSlideLeave: function( section, origin, destination, direction, trigger){\r\n\t\tvar leavingSlide = this;\r\n\r\n\t\t//abandonando la primera diapositiva de la segunda sección y moviendo hacia la derecha\r\n\t\tif(section.index == 1 && origin.index == 0 && direction == 'right'){\r\n\t\t\talert(\"Abandonando la diapositiva 1!!\");\r\n\t\t}\r\n\r\n\t\t//abandonando la tercera diapositiva de la segunda sección y moviendo hacia la izquierda\r\n\t\tif(section.index == 1 && origin.index == 2 && direction == 'left'){\r\n\t\t\talert(\"Yendo a la diapositiva 2! \");\r\n\t\t}\r\n\t}\r\n});\r\n```\r\n\r\n#### Cancelando un desplazamiento antes de que tenga lugar\r\nPuedes cancelar el desplazamiento devolviendo `false` en el callback `onSlideLeave`. Exactamente igual que cuando se usa [`onLeave`](https://github.com/alvarotrigo/fullPage.js/blob/master/README_SPANISH.md#cancelando-un-desplazamiento-antes-de-que-tenga-lugar).\r\n\r\n\r\n---\r\n### onScrollOverflow (`section`, `slide`, `position`, `direction`)\r\n[Demo](https://codepen.io/alvarotrigo/pen/XbPNQv) This callback gets fired when a scrolling inside a scrollable section when using the fullPage.js option `scrollOverflow: true`.\r\n\r\nParameters:\r\n\r\n- `section`: *(Object)* active vertical section.\r\n- `slide`: *(Object)* horizontal slide of origin.\r\n- `position`: *(Integer)* scrolled amount within the section/slide. Starts on 0.\r\n- `direction`: *(String)* `up` o `down`\r\n\r\nExample:\r\n\r\n```javascript\r\nnew fullpage('#fullpage', {\r\n\tonScrollOverflow: function( section, slide, position, direction){\r\n\t\tconsole.log(section);\r\n\t\tconsole.log(\"position: \" + position);\r\n\t}\r\n});\r\n```\r\n\r\n# Reportando problemas\r\n1. Por favor, usa el buscador en Github issues para buscar tu duda o problema antes de preguntar.\r\n2. Asegurate de que estás usando la última versión de fullPage.js. No se provee soporte a versiones anteriores.\r\n3. Usa el [foro de Github](https://github.com/alvarotrigo/fullPage.js/issues) para crear la pregunta o tema y **házlo en inglés** a ser posible.\r\n4. **Se requerirá la reproducción aislada del problema.** Usa [jsfiddle](https://jsfiddle.net/alvarotrigo/ea17skjr/) o [codepen](https://codepen.io/alvarotrigo/pen/NxyPPp) si es posible.\r\n\r\n# Contribuir con fullPage.js\r\nPor favor mira [Contributing to fullpage.js](https://github.com/alvarotrigo/fullPage.js/wiki/Contributing-to-fullpage.js)\r\n\r\n# Changelog\r\nPara ver la lista de cambios recientes, mira [la sección de releases](https://github.com/alvarotrigo/fullPage.js/releases).\r\nSólo disponible en inglés :)\r\n\r\n# Build tasks\r\n¿Deseas crear archivos de distribución de fullpage.js? Lee los [Build Tasks](https://github.com/alvarotrigo/fullPage.js/wiki/Build-tasks)\r\n\r\n# Recursos\r\n- Wordpress Plugin [for Gutenberg](https://alvarotrigo.com/fullPage/wordpress-plugin-gutenberg/) and [for Elementor](https://alvarotrigo.com/fullPage/wordpress-plugin-elementor/).\r\n- [Template de Wordpress](https://alvarotrigo.com/fullPage/utils/wordpress.html)\r\n- [Official Vue.js wrapper component](https://github.com/alvarotrigo/vue-fullpage.js)\r\n- [Official React.js wrapper component](https://github.com/alvarotrigo/react-fullpage)\r\n- [Official Angular wrapper component](https://github.com/alvarotrigo/angular-fullpage)\r\n- [Herramienta de animacion de CSS Easing - Matthew Lein](https://matthewlein.com/ceaser/) (útil para definir la opción `easingcss3`)\r\n- [fullPage.js jsDelivr CDN](https://www.jsdelivr.com/package/npm/fullpage.js)\r\n- [fullPage.js plugin para October CMS](https://github.com/freestream/oc-parallax-plugin)\r\n- [fullPage.js Angular2 directive](https://github.com/meiblorn/ng2-fullpage)\r\n- [fullPage.js angular directive](https://github.com/hellsan631/angular-fullpage.js)\r\n- [fullPage.js ember-cli addon](https://www.npmjs.com/package/ember-cli-fullpagejs)\r\n- [fullPage.js Rails Ruby Gem](https://rubygems.org/gems/fullpagejs-rails)\r\n- [Angular fullPage.js - Adaptation for Angular.js v1.x](https://github.com/mmautomatizacion/angular-fullpage.js)\r\n- [Integrating fullPage.js con Wordpress (Tutorial)](https://premium.wpmudev.org/blog/build-apple-inspired-full-page-scrolling-pages-for-your-wordpress-site/)\r\n\r\n## Quién usa fullPage.js\r\n\r\n![Who is using fullPage.js](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/using-fullpage.png)\r\n\r\n- http://www.bbc.co.uk/news/resources/idt-d88680d1-26f2-4863-be95-83298fd01e02\r\n- http://medoff.ua/en/\r\n- http://promo.prestigio.com/grace1/\r\n- http://torchbrowser.com/\r\n- http://www.boxreload.com/\r\n- http://boxx.hk/\r\n- http://www.villareginateodolinda.it\r\n\r\n## Sponsors\r\nConviértete en patrocinador y coloca tu logotipo en nuestro README de GitHub con un enlace a tu sitio. [[Contáctanos](https://alvarotrigo.com/#contact)] | [[Hazte Patreon]](https://www.patreon.com/fullpagejs) | [Hazte patrocinador en GitHub](https://github.com/sponsors/alvarotrigo)\r\n\r\n\r\n[![Warp](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/warp.png)](http://go.warp.dev/fullPage)\r\n[![Crawlbase](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/crawlbase.png)](https://crawlbase.com/?utm_source=github&utm_medium=sponsor&utm_campaign=fullpagejs)\r\n[![TestMu](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/testmu-ai.png)](https://www.testmu.com/?utm_source=fullpagejs&utm_medium=sponsor)\r\n[![Codeless](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codeless.png)](https://codeless.co)\r\n[![Stackpath](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/stackpath3.png)](https://www.stackpath.com/)\r\n[![Browserstack](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/browserstack3.png)](http://www.browserstack.com/)\r\n[![CodePen](https://cdn.jsdelivr.net/gh/alvarotrigo/fullpage-assets/imgs/sponsors/codepen3.png)](https://codepen.com)\r\n\r\n### People\r\n<a href=\"https://github.com/donsalvadori\" target=\"_blank\" rel=\"nofollow\">\r\n\t<img src=\"http://wallpapers-for-ipad.com/fullpage/imgs3/avatars/donsalvadori.jpg\">\r\n</a>\r\n\r\n## Contributors\r\n\r\n<a href=\"https://github.com/alvarotrigo/fullPage.js/graphs/contributors\">\r\n  <img src=\"https://contrib.rocks/image?repo=alvarotrigo/fullPage.js&max=400&columns=25&anon=1&v=2\" />\r\n</a>"
  },
  {
    "path": "lang/spanish/how-to-activate-fullpage-extension.md",
    "content": "# Cómo activar una extension de fullPage.js\n\n1. Accede https://alvarotrigo.com/fullPage/extensions/activationKey.html. (Que es la URL que se te envía por email tras la compra de la extensión)\n1. Inserta la *clave de licencia* que se te mostró tras la compra de la extensión. También disponible en el email de confirmación de compra.\n1. Dependiendo de tu licencia. Es posible que necesites insertar un dominio para obtener la **clave de activación** para tu producto.\n1. Una vez tengas la **clave de activación** para tu extensión y dominio (generada en los pasos anteriores) tendrás que añadir la opción correspondiente a tu extensión en la inicilización de fullPage.js. Ésta tendrá la forma de nombreDeExtensión + \"Key\": key.\n\nPor ejemplo:\n\n```javascript\nvar myFullpage = new fullpage('#fullpage', {\n    fadingEffect: true,\n    fadingEffectKey: 'LA CLAVE DE ACTIVACIÓN HA DE COLOCARSE AQUÍ',\n});\n```\n\nLo mismo ocurriría con el resto de extensiones que estés usando.\nEstas son todas las posibles opciones para otras claves de extensiones:\n\n* `fadingEffectKey`\n* `responsiveSlidesKey`\n* `continuousHorizontalKey`\n* `interlockedSlidesKey`\n* `scrollHorizontallyKey`\n* `resetSlidersKey`\n* `offsetSectionsKey`\n* `dragAndMoveKey`\n* `parallaxKey`\n* `cardsKey`\n\nRecuerda el uso de extensiones requiere del uso de [`fullpage.extensions.min.js`](https://github.com/alvarotrigo/fullPage.js/blob/master/dist/fullpage.extensions.min.js) en lugar del habitual archivo de fullPage.js (`fullpage.js`) tal y como se explica en [el uso de extensiones](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish#uso-de-extensiones).\n\n### Qué hacer para entornos de desarrollo y webs de testeo?\nNo se requiere del uso de clave de activación para entornos localhost.\nSi necesitas usar una extensión en un entorno de desarrollo externo, puedes obtender la clave de activación para dicho dominio y luego [contactar conmigo](http://alvarotrigo.com/#contact) para que te de otra clave cuando lo muevas a producción.\n\nSi tienes una licencia que te permite generar varias claves de activación para varios dominios tal vez quieras usar el mismo código JS para todos ellos. En este caso puedes usar un array con las diferentes claves para cada dominio. Por ejemplo, si estamos usando la extensión `scrollHorizontally` para 3 dominios podemos hacer lo siguiente:\n\n```js\nnew fullPage('#fullpage', {\n    scrollHorizontally: true,\n    scrollHorizontallyKey: ['domain1_key', 'domain2_key', 'domain3_key'] \n});\n```\n\nDe este modo la extensión podrá usarse en los 3 dominios.\n\n\n### Clave de licencia vs clave de activación\nSon claves muy diferentes:\n- Obtienes la **clave de licencia** cuando compras cualquier extensión.\n- Obtienes la **clave de activación** cuando activas una extensión para un dominio en concreto (a no ser que uses la licencia de dominios ilimitados). Para generar la clave de actiación necesitarás hacer uso de la clave de licencia.\n\nLa clave de licencia está compuesta por 4 grupos de 8 caracteres cada uno (`XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX`) y la clave de activación tiene una longitud variable y no está compuesta por grupos separados (`XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`).\nEs importante no confundir ámbas."
  },
  {
    "path": "lang/spanish/parallax-extension.md",
    "content": "![](https://cloud.githubusercontent.com/assets/1706326/23580315/f28edab4-00f6-11e7-90f9-81ffafd77b0e.gif)\n\nLee [como usar Extensiones](https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish#uso-de-extensiones) antes de usar la opción de parallax.\n- [Ejemplo online](http://alvarotrigo.com/fullPage/extensions/parallax.html)\n- [Estructura HTML necesaria](#estructura-html-necesaria)\n- [Añadiendo la imagen de fondo](#a%C3%B1adiendo-la-imagen-de-fondo)\n- [Opciones](#opciones)\n  - [Opciones del efecto parallax](#opciones-del-efecto-parallax)\n- [Métodos](#m%C3%A9todos)\n\n## Estructura HTML necesaria\nPara usar el efecto de parallax en secciones o diapositivas, tendremos que añadir un nuevo elemento que use la clase `fp-bg`. Será un elemento `div` vacío que situaremos como primer elemento debajo de la sección o diapositiva a la que pertenece.\n\n```html\n<div class=\"fp-bg\"></div>\n```\n\nSobre éste elemento tendremos que aplicar la imagen de fondo, en lugar de hacerlo diréctamente sobre la sección o las diapositivas a las que pertenece.\n\nPor ejemplo:\n```html\n<div id=\"fullpage\">\n    <div class=\"section\" id=\"section1\">\n        <div class=\"fp-bg\"></div>\n        Diapositiva 1.1\n    </div>\n    <div class=\"section\" id=\"section2\">\n        <div class=\"slide\" id=\"slide2-1\">\n            <div class=\"fp-bg\"></div>\n            Diapositiva 2.1\n        </div>\n        <div class=\"slide\" id=\"slide2-2\">\n            <div class=\"fp-bg\"></div>\n            Diapositiva 2.2\n        </div>\n    </div>\n</div>\n```\n\nPodrás observar esta misma estructura en el código fuente del [ejemplo de parallax](http://alvarotrigo.com/fullPage/extensions/parallax.html).\n\n> Si por alguna razón no quieres añadir un nuevo elemento fp-bg en la estructura de la página, puedes usar la opción `property` dentro de `parallaxOptions` y definir su valor a `background`. De este modo podrás aplicar el fondo directamente sobre la sección o diapositiva.\n> Como se explicará luego en la sección de Opciones del efecto parallax, solamente recomiendo hacer ésto si es realmente necesario, pues el rendimiento no será el mismo que cuando se usa el elemento `fp-bg`.\n\n<br>\n\n## Añadiendo la imagen de fondo\nEl fondo debe aplicarse directamente sobre el elemento `fp-bg` del mismo modo que lo harías en una sección o diapositiva.\nPuedes usar CSS para ello o bien usar estilos inline a través del atributo `style`.\n\nPor ejemplo:\n```css\n#section1 .fp-bg{\n    background-image: url('imgs/alvaro-genious.jpg');\n    background-size: cover;\n    background-position: center 80%;\n}\n```\n\n## Opciones\n\n| Opción  | Descripción |\n| ------------- | ------------- |\n| **parallax**  | (por defecto `false`). [Extension of fullPage.js](http://alvarotrigo.com/fullPage/extensions/). Determina si usar el efecto de parallax en secciones y diapositivas. Los valores posibles son `false`, `true`, `sections`, `slides`|\n| **parallaxOptions:**   | (por defecto: `{ type: 'reveal', percentage: 62, property: 'translate'}`). Permite configurar los parámetros para el efecto de parallax cuando se usa la opción `parallax: true`.     |\n<br>\n\n### Opciones del efecto parallax\nPuedes verlas en acción en [la página de ejemplo](http://alvarotrigo.com/fullPage/extensions/parallax.html).\n\nDescripción de las opciones de configuración disponibles en la opción `parallaxOptions`:\n\n| parallaxOptions  | Descripción |\n| ------------- | ------------- |\n| **type**  | (por defecto `reveal`) Los posibles valores para esta opción son `cover` y `reveal`. Permiten escoger el modo en el que se superponen las secciones o diapositivas determinando si la sección/diapositiva actual estará encima o debajo de la de destino. Cuando se usa la opción `cover` la sección/diapositiva destino aparecerá cubriendo parte de la sección/diapositiva actual. Si se usa `reveal` el efecto será el contrario y se cubrirá parte de la sección/diapositiva de destino mientras ésta va apareciendo. |\n| **percentage**  | (por defecto 62 ) permite definir el porcentaje del efecto parallax en relación con el viewport (tamaño de la pantalla). Usar un valor pequeño resultará en un efecto parallax menor, y usar 100, que es el máximo, mostrará un fondo estático.  |\n| **property** | Determina si se aplicará el efecto parallax sobre el elemento `fp-bg` o directamente sobre la propiedad background de la sección/diapositva. Se recomienda usar el valor por defecto para esta opción. |\n\nSe ha de tener en cuenta que usar el elemento `fp-bg` proporciona un rendimiento mucho mejor y más fluido a la hora de realizar el efecto. Ésto es así porque de este modo se hace uso de la aceleración por hardware al usar translate3d. La opción `background` está disponible para  aquellos que por alguna razón no quieran añadir el elemento extra `fp-bg` o que no puedan modificar el código HTML.\n\n## Métodos\nPuedes verlos en acción en [la página de ejemplo](http://alvarotrigo.com/fullPage/extensions/parallax.html).\n\n### setOption(optionName, value)\nDefine un valor para la opción que se le pase como parámetro. `optionName` puede ser cualquiera de las opciones disponibles en `parallaxOptions`. (`type`, `percentage`, o `property`).\n\n```javascript\n//cambiando el valor de la propiedad `typo`\nfullpage_api.parallax.setOption('type', 'cover');\n\n//cambiando el valor de la propiedad `percentage`\nfullpage_api.parallax.setOption('percentage', '30');\n```\n---\n\n### init()\nHabilita el efecto parallax. Es útil cuando se necesita habilitar dicho efecto de modo dinámico en cierto momento determinado.\n```javascript\nfullpage_api.parallax.init();\n```\n---\n### destroy()\nDeshabilita el efecto parallax.\n```javascript\nfullpage_api.parallax.destroy();\n```\n"
  },
  {
    "path": "lang/website/br.yml",
    "content": "#Page meta data\ntitle: fullPage.js | Plugin para site de seções de rolagem de uma página\ndescription: fullPage plugin por Alvaro Trigo. Crie páginas em tela cheia de forma rápida e simples. Plugin jQuery de seções de rolagem de uma página. Estalo do mouse.\nkeywords: fullpage,jquery,alvaro,trigo,plugin,fullscren,screen,full,iphone5,snap,snapping,apple,scroll,sections\nog-title: encaixe de rolagem de página inteira. Crie páginas em tela cheia de forma rápida e simples\nog-description: A roda do mouse se encaixa nas seções. Rápido e simples de usar.\ntwitter-description: Ótima biblioteca Javascript para criar sites de rolagem em tela cheia\n\n#Sections content\nCreate Beautiful Fullscreen Scrolling Websites: Crie belos sites de rolagem em tela cheia\nDownload: Download\nView on GitHub: Ver no GitHub\nOpen: Abrir\nfullPage.js is actively mantained and community driven.: fullPage.js é orientado e mantido ativamente pela comunidade.\nSolving developers' issues since 2013.: Resolvendo problemas de desenvolvedores desde 2013.\ncommits: commits\nclosed issues: issues fechadas\ncontributors: contribuidores\nThe best!: O melhor!\nCompatible: Compatível\nEasy!: Fácil!\nSee in Codepen: Veja no Codepen\nTouch me!: Toque-me!\nDesigned for mobiles and tablets, totally responsive.: Projetado para celulares e tablets, totalmente responsivo.\nBecause not only kids like to grab things.: Porque não só as crianças gostam de pegar coisas.\n\n#menu\nWordpress Theme: Tema de WordPress\nWordPress: WordPress\nExamples: Exemplos\nPricing: Preços\nDocs: Documentação\nContact: Contato\n\n#sections content\nProud of being the most complete framework of its kind.: Orgulho de ser o mais completo framework de seu gênero.\nTrusted by the most innovative companies.: Confiado pelas companhias mais inovadoras.\nWorking in modern and old browsers too! Even IE 9!: Funcionando em navegadores modernos e antigos também! Até no IE 9!\nMake a beautiful site for all! Not just a few!: Faça um site bonito para todos! Não apenas alguns!\nfullPage.js is designed to be easy to use and customize.: fullPage.js é projetado para ser fácil de usar e customizável.\nIt inludes tens of examples, great documentation and both community and personal support.: Inclui dezenas de exemplos, ótima documentação e tanto suporte da comunidade quanto individual.\n\n#sections content\nNavigation: Navegação\nScroll Bar Enabled: Barra de rolagem habilitada\nNormal scrolling: Rolagem normal\nContinuous vertical: Vertical contínua\nWithout anchor links (same URL): Sem links âncora (mesma URL)\nVertical navigation dots: Pontos de navegação verticais\nHorizontal navigation dots: Pontos de navegação horizontais\nExtensions: Extensões\nCards 3D: Cards 3D\nParallax: Parallax\nContinuous Horizontal: Horizontal Contínua\nInterlocked Slides: Slides Intertravados\nReset Sliders: Controles Deslizantes de Redefinição\nResponsive Slides: Slides Responsivos\nScroll Horizontally: Role Horizontalmente\nFading Effect: Efeito de Desvanecimento\nOffset Sections: Seções de Deslocamento\nDrag And Move: Arraste e Mova\nScrollOverflow Reset: Redefinição de ScrollOverflow\nDesign: Design\nResponsive: Responsivo\nFull backgrounds: Planos de fundo inteiros\nFull background videos:  Vídeos de fundo inteiros\nAuto-height sections: Seções de altura automática\nGradient backgrounds: Planos de fundo com Gradiente\nScrolling inside sections and slides: Rolagem dentro de seções e slides\nAdding fixed header and footer: Adicionando cabeçalho e rodapé fixos\nOne single section: Seção única\nOther: Outros\nAnimations on scrolling: Animações ao rolar\nCallbacks: Callbacks\nFunctions and methods: Funções e métodos\n\ndocumentation-link: https://github.com/alvarotrigo/fullPage.js/tree/master/lang/brazilian-portuguese#fullpagejs\nextensions-link: https://alvarotrigo.com/fullPage/extensions/br/\nlang: br\nflag-name: flag-brazilian\nlanguage-name: Português Brasileiro\ncanonical-link: https://alvarotrigo.com/fullPage/br/\nlanguage-menu:\n      <li><a href=\"https://alvarotrigo.com/fullPage/ru/\"><span class=\"flag flag-russian\"></span>Pусский</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/ko/\"><span class=\"flag flag-korean\"></span>한국어</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/es/\"><span class=\"flag flag-spanish\"></span>Español</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/zh/\"><span class=\"flag flag-chinese\"></span>中文</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/br/\"><span class=\"flag flag-brazilian\"></span>Português Brasileiro</a></li>\n\n\n# Extensions website\nNeed some extra feature? Fullpage.js provides extensions that you can use to enhance its already amazing behavior!: Precisa de algum recurso extra? Fullpage.js fornece extensões que você pode usar para melhorar seu comportamento já incrível!\nParallax Backgrounds: Planos de fundo com Parallax\nCreates a parallax effect for the backgrounds of sections and slides when scrolling and sliding.: Cria um efeito de Parallax para os fundos de seções e slides ao rolar e deslizar.\nBuy: Comprar\nDemo: Demonstração\n#ScrollOverflow Reset: ScrollOverflow Reset\nScrolls back the content of the section/slide with scroll bar when leaving it so it will always be at the start.: Rola para trás o conteúdo da seção/slide com a barra de rolagem ao deixá-la para que sempre esteja no início.\n#Drag And Move: Drag And Move\nAllows to move between sections and slides by clicking and dragging the mouse as well as by swiping with fingers.: Permite mover-se entre seções e slides clicando e arrastando o mouse, bem como deslizando com os dedos.\n#Offset Sections: Offset Sections\nProvides a way to use non full screen sections based on percentage. Ideal to show visitors there's more content in the site by showing part of the next or previous section.: Fornece uma maneira de usar seções que não sejam de tela cheia com base na porcentagem. Ideal para mostrar aos visitantes que há mais conteúdo no site, mostrando parte da seção seguinte ou anterior.\n#Fading Effect: Fading Effect\nProvides a fading effect for vertical sections and horizontal slides or for any of them separately.: Fornece um efeito de desvanecimento para seções verticais e slides horizontais ou para qualquer um deles separadamente.\n#Responsive Slides: Responsive Slides\nAllows the turn of horizontal slides into vertical sections on responsive or by using external functions.: Permite a conversão de slides horizontais em seções verticais no responsivo ou usando funções externas.\n#Continuous Horizontal: Continuous Horizontal\nProvides the continuous horizontal scrolling feature for all the sliders.: Fornece o recurso de rolagem horizontal contínua para todos os controles deslizantes.\n#Interlocked Slides: Interlocked Slides\nProvides a way to force the moving of sliders in other sections when sliding the visible one.: Fornece uma maneira de forçar o movimento dos controles deslizantes em outras seções ao deslizar o visível.\n#Scroll Horizontally: Scroll Horizontally\nProvides horizontal scroll within sliders by using the mouse wheel or trackpad. Ideal for story telling!: Fornece rolagem horizontal nos controles deslizantes usando a roda do mouse ou o trackpad. Ideal para contar histórias!\n#Reset Sliders: Reset Sliders\nForces fullpage.js to reset every slider after leaving its section. This way when the users goes back it will always be in the first slide of the slider.: Força fullpage.js a redefinir cada controle deslizante após sair de sua seção. Dessa forma, quando os usuários voltarem, ele sempre estará no primeiro slide do controle deslizante.\nWhich license should I use?: Qual licença eu devo usar?\nFor up to 1 website: Para até 1 website\nHobby: Hobby\n1 domain: 1 domínio\nMinified source code: Código fonte minificado\nFree updates: Atualizações grátis\nLicense agreement: Contrato de licença\nFor up to 5 websites: Para até 5 websites\nProfessional: Profissional\nBest value!: Melhor valor!\n5 domains: 5 domínios\nFor unlimited websites: Para sites ilimitados\nBusiness: Business\nUnlimited Domains: Domínios ilimitados\nCommon activation key: Chave de ativação genérica\nUse in SaaS product: Use em produtos SaaS\nRefund: Reembolso\nUpdates: Atualizações\nStaging / dev domains: Domínios de Staging / desenvolvimento\nTrusted by the world’s most innovative companies: Confiado pelas companhias mais inovadoras do mundo\nPeople love fullPage.js!: Pessoas amam fullPage.js!\nVertical Navigation: Navegação Vertical\nAdd the stylesheet after jquery.fullpage.css and... that's it!: Adicione os estilos depois de jquery.fullpage.css e... é isso!\nAvailable in 2 sizes: Disponível em 2 tamanhos\nGet all navigation styles from Â£9: Consiga todos os estilos de navegação por Â£9\n30-Day Money Back Guarrantee: Garantia de devolução do dinheiro em 30 dias\nSubscribe: Inscreva-se\nGet notified of new extensions or fullpage.js relevant announcements.: Receba notificações sobre novas extensões ou anúncios relevantes do fullpage.js.\nActivation Key per Domain: Chave de Ativação por Domínio\nOnly if no activation key was generated.: Apenas se nenhuma chave de ativação foi gerada.\nRead the license refund terms: Leia os termos de licença de reembolso.\n1 month support: 1 mês de suporte\nIsolated reproductions might be required.: Reproduções isoladas podem ser necessárias.\nRead the license support terms: Leia os termos de licença de suporte.\n6 months support: 6 meses de suporte\nUnlimited support: Suporte prioritário ilimitado\nRedistribute: Redistribuir\nGot questions? Check the: Possui dúvidas? Confira o\n30-days money back guaranteed for any purchase under the conditions detailed in the License Agreement: 30 dias de reembolso garantido para qualquer compra sob as condições detalhadas no Contrato de Licença\nfullPage.js Refund Terms: Termos de reembolso do fullPage.js\nAll licenses include free updates for the purchased license and buyers will be notified by mail of new releases.: Todas as licenças incluem atualizações gratuitas para a licença adquirida e os compradores serão notificados por correio sobre novos lançamentos.\nUpon request: A pedido\nnew activation keys can be provided for staging or developing domains to a maximum of 3.: novas chaves de ativação podem ser fornecidas para domínios de teste ou desenvolvimento até um máximo de 3 chaves.\nNo activation key is necessary for `localhost` and `127.0.0.1`.: Nenhuma chave de ativação é necessária para localhost e 127.0.0.1.\nAny other staging domains will require a license (Professional or Business) that allows to generate a new key for those.: Quaisquer outros domínios de teste exigirão uma licença (Professional ou Business) que permita gerar uma nova chave para eles.\nYour email address: Seu endereço de email\nGenerate only 1 activation key. No dev/staging domains possible.: Gere apenas uma chave de ativação. Sem domínios de desenvolvimento/staging.\nPrice varies depending on the extension: Preço varia dependendo da extensão\nGenerate up to 5 activation keys. Dev/staging domains included.: Gere até 5 chaves de ativação. Domínios de desenvolvimento/staging inclusos.\nGenerate a common activation key: Gere uma chave de ativação genérica\nWithin a product: Dentro de um produto\nMobile applications: Aplicações mobile\n\nlanguage-menu-extensions:\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/ru/\"><span class=\"flag flag-russian\"></span>Pусский</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/ko/\"><span class=\"flag flag-korean\"></span>한국어</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/es/\"><span class=\"flag flag-spanish\"></span>Español</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/zh/\"><span class=\"flag flag-chinese\"></span>中文</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/br/\"><span class=\"flag flag-brazilian\"></span>Português Brasileiro</a></li>\n"
  },
  {
    "path": "lang/website/en.yml",
    "content": "#Page meta data\ntitle: fullPage.js | One Page Scroll sections Site Plugin\ndescription: fullPage plugin by Alvaro Trigo. Create fullscreen pages fast and simple. One page scroll sections jquery plugin. Mouse snap.\nkeywords: fullpage,jquery,alvaro,trigo,plugin,fullscren,screen,full,iphone5,snap,snapping,apple,scroll,sections\nog-title: fullPage scroll snapping. Create full screen pages fast and simple\nog-description: Mouse wheel snap to sections. Fast and simple to use.\ntwitter-description: Great Javascript library to create fullscreen scrolling websites\n\n#Sections content\nCreate Beautiful Fullscreen Scrolling Websites: Create Beautiful Fullscreen Scrolling Websites\nDownload: Download\nView on GitHub: View on GitHub\nOpen: Open\nfullPage.js is actively maintained and community driven.: fullPage.js is actively mantained and community driven.\nSolving developers' issues since 2013.: Solving developers' issues since 2013.\ncommits: commits\nclosed issues: closed issues\ncontributors: contributors\nThe best!: The best!\nCompatible: Compatible\nEasy!: Easy!\nSee in Codepen: See in Codepen\nTouch me!: Touch me!\nDesigned for mobiles and tablets, totally responsive.: Designed for mobiles and tablets, totally responsive.\nBecause not only kids like to grab things.: Because not only kids like to grab things.\n\n#menu\nWordpress Theme: Wordpress Theme\nWordPress: WordPress\nExamples: Examples\nPricing: Pricing\nDocs: Docs\nContact: Contact\n\n#sections content\nProud of being the most complete framework of its kind.: Proud of being the most complete framework of its kind.\nTrusted by the most innovative companies.: Trusted by the most innovative companies.\nWorking in modern and old browsers too!: Working in modern and old browsers too!\nMake a beautiful site for all! Not just a few!: Make a beautiful site for all! Not just a few!\nfullPage.js is designed to be easy to use and customize.: fullPage.js is designed to be easy to use and customize.\nIt includes tens of examples, great documentation and both community and personal support.: It includes tens of examples, great documentation and both community and personal support.\n\n#sections content\nNavigation: Navigation\nScroll Bar Enabled: Scroll Bar Enabled\nNormal scrolling: Normal scrolling\nContinuous vertical: Continuous vertical\nWithout anchor links (same URL): Without anchor links (same URL)\nVertical navigation dots: Vertical navigation dots\nHorizontal navigation dots: Horizontal navigation dots\nExtensions: Extensions\nCards 3D: Cards 3D\nParallax: Parallax\nContinuous Horizontal: Continuous Horizontal\nInterlocked Slides: Interlocked Slides\nReset Sliders: Reset Sliders\nResponsive Slides: Responsive Slides\nScroll Horizontally: Scroll Horizontally\nFading Effect: Fading Effect\nOffset Sections: Offset Sections\nDrag And Move: Drag And Move\nScrollOverflow Reset: ScrollOverflow Reset\nDesign: Design\nResponsive: Responsive\nFull backgrounds: Full backgrounds\nFull background videos: Full background videos\nAuto-height sections: Auto-height sections\nGradient backgrounds: Gradient backgrounds\nScrolling inside sections and slides: Scrolling inside sections and slides\nAdding fixed header and footer: Adding fixed header and footer\nOne single section: One single section\nOther: Other\nAnimations on scrolling: Animations on scrolling\nCallbacks: Callbacks\nFunctions and methods: Functions and methods\n\ndocumentation-link: https://alvarotrigo.com/fullPage/docs/\ndocumentation-link-github: https://github.com/alvarotrigo/fullPage.js\nextensions-link: https://alvarotrigo.com/fullPage/extensions/\nlang: en\nflag-name: flag-english\nlanguage-name: English\ncanonical-link: https://alvarotrigo.com/fullPage/\nlanguage-menu:\n      <li><a href=\"https://alvarotrigo.com/fullPage/ko/\"><span class=\"flag flag-korean\"></span>한국어</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/ja/\"><span class=\"flag flag-japanese\"></span>日本語</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/ru/\"><span class=\"flag flag-russian\"></span>Pусский</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/es/\"><span class=\"flag flag-spanish\"></span>Español</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/zh/\"><span class=\"flag flag-chinese\"></span>中文</a></li>\n\n\n# Extensions website\nNeed some extra feature? Fullpage.js provides extensions that you can use to enhance its already amazing behavior!: Need some extra feature? Fullpage.js provides extensions that you can use to enhance its already amazing behavior!\nParallax Backgrounds: Parallax Backgrounds\nCreates a parallax effect for the backgrounds of sections and slides when scrolling and sliding.: Creates a parallax effect for the backgrounds of sections and slides when scrolling and sliding.\nBuy: Buy\nDemo: Demo\n#ScrollOverflow Reset: ScrollOverflow Reset\nScrolls back the content of the section/slide with scroll bar when leaving it so it will always be at the start.: Scrolls back the content of the section/slide with scroll bar when leaving it so it will always be at the start.\n#Drag And Move: Drag And Move\nAllows to move between sections and slides by clicking and dragging the mouse as well as by swiping with fingers.: Allows to move between sections and slides by clicking and dragging the mouse as well as by swiping with fingers.\n#Offset Sections: Offset Sections\nProvides a way to use non full screen sections based on percentage. Ideal to show visitors there's more content in the site by showing part of the next or previous section.: Provides a way to use non full screen sections based on percentage. Ideal to show visitors there's more content in the site by showing part of the next or previous section.\n#Fading Effect: Fading Effect\nProvides a fading effect for vertical sections and horizontal slides or for any of them separately.: Provides a fading effect for vertical sections and horizontal slides or for any of them separately.\n#Responsive Slides: Responsive Slides\nAllows the turn of horizontal slides into vertical sections on responsive or by using external functions.: Allows the turn of horizontal slides into vertical sections on responsive or by using external functions.\n#Continuous Horizontal: Continuous Horizontal\nProvides the continuous horizontal scrolling feature for all the sliders.: Provides the continuous horizontal scrolling feature for all the sliders.\n#Interlocked Slides: Interlocked Slides\nProvides a way to force the moving of sliders in other sections when sliding the visible one.: Provides a way to force the moving of sliders in other sections when sliding the visible one.\n#Scroll Horizontally: Scroll Horizontally\nProvides horizontal scroll within sliders by using the mouse wheel or trackpad. Ideal for story telling!: Provides horizontal scroll within sliders by using the mouse wheel or trackpad. Ideal for story telling!\n#Reset Sliders: Reset Sliders\nForces fullpage.js to reset every slider after leaving its section. This way when the users goes back it will always be in the first slide of the slider.: Forces fullpage.js to reset every slider after leaving its section. This way when the users goes back it will always be in the first slide of the slider.\nWhich license should I use?: Which license should I use?\nFor up to 1 website: For up to 1 website\nHobby: Hobby\n1 domain: 1 domain\nMinified source code: Minified source code\nFree updates: Free updates\nLicense agreement: License agreement\nFor up to 5 websites: For up to 5 websites\nProfessional: Professional\nBest value!: Best value!\n5 domains: 5 domains\nFor unlimited websites: For unlimited websites\nBusiness: Business\nUnlimited Domains: Unlimited Domains\nCommon activation key: Common activation key\nUse in SaaS product: Use in SaaS product\nRefund: Refund\nUpdates: Updates\nStaging / dev domains: Staging / dev domains\nTrusted by the world’s most innovative companies: Trusted by the world's most innovative companies\nPeople love fullPage.js!: People love fullPage.js!\nVertical Navigation: Vertical Navigation\nAdd the stylesheet after fullpage.css and... that's it!: Add the stylesheet after fullpage.css and... that's it!\nAvailable in 2 sizes: Available in 2 sizes\nGet all navigation styles from Â£9: Get all navigation styles from Â£9\n30-Day Money Back Guarrantee: 30-Day Money Back Guarantee\nSubscribe: Subscribe\nGet notified of new extensions or fullpage.js relevant announcements.: Get notified of new extensions or fullpage.js relevant announcements.\nActivation Key per Domain: Activation Key per Domain\nOnly if no activation key was generated.: Only if no activation key was generated.\nRead the license refund terms: Read the license refund terms\n1 month support: 1 month support\nIsolated reproductions might be required.: Isolated reproductions might be required.\nRead the license support terms: Read the license support terms\n6 months support: 6 months support\nUnlimited support: Priority unlimited support\nRedistribute: Redistribute\nGot questions? Check the: Got questions? Check the\n30-days money back guaranteed for any purchase under the conditions detailed in the License Agreement: 30-days money back guaranteed for any purchase under the conditions detailed in the License Agreement\nfullPage.js Refund Terms: fullPage.js Refund Terms\nAll licenses include free updates for the purchased license and buyers will be notified by mail of new releases.: All licenses include free updates for the purchased license and buyers will be notified by mail of new releases.\nUpon request: Upon request\nnew activation keys can be provided for staging or developing domains to a maximum of 3.: new activation keys can be provided for staging or developing domains to a maximum of 3.\nNo activation key is necessary for `localhost` and `127.0.0.1`.: No activation key is necessary for localhost and 127.0.0.1.\nAny other staging domains will require a license (Professional or Business) that allows to generate a new key for those.: Any other staging domains will require a license (Professional or Business) that allows to generate a new key for those.\nYour email address: Your email address\nGenerate only 1 activation key. No dev/staging domains possible.: Generate only 1 activation key. No dev/staging domains possible.\nPrice varies depending on the extension: Price varies depending on the extension\nGenerate up to 5 activation keys. Dev/staging domains included.: Generate up to 5 activation keys. Dev/staging domains included.\nGenerate a common activation key: Generate a common activation key\nWithin a product: Within a product\nMobile applications: Mobile applications\n\n#extensions bundle:\nAll extensions bundle: All extensions bundle\nGet all the extensions starting from $119!: Get all the extensions starting from $119!\nIncluding future ones!: Including future ones!\nGet the extensions pack!: Get the extensions pack!\n\n\nlanguage-menu-extensions:\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/ru/\"><span class=\"flag flag-russian\"></span>Pусский</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/ko/\"><span class=\"flag flag-korean\"></span>한국어</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/es/\"><span class=\"flag flag-spanish\"></span>Español</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/zh/\"><span class=\"flag flag-chinese\"></span>中文</a></li>\n"
  },
  {
    "path": "lang/website/es.yml",
    "content": "#Page meta data\ntitle: fullPage.js | Crea webs con desplazamiento de secciones a pantalla completa\ndescription: fullPage plugin por Alvaro Trigo. Crea páginas web con desplazamiento a pantalla completa por secciones. Librería jQuery Javascript.\nkeywords: fullpage,jquery,alvaro,trigo,plugin,fullscren,pantalla,completa,scroll,secciones,diapositivas,desplazamiento,powerpoint\nog-title: Crea webs a pantalla completa con scroll.\nog-description: Crea webs con desplazamiento a pantalla completa por secciones.\ntwitter-description: Genial librería Javascript para crear webs con desplazamiento a pantalla completa por secciones.\n\n#Sections content\nCreate Beautiful Fullscreen Scrolling Websites: Crea increibles páginas web con desplazamiento\nDownload: Descargar\nView on GitHub: Ver en GitHub\nOpen: Abierto\njs is actively maintained and community driven: js está bajo constante mantenimiento y es impulsado por la comunidad.\nSolving developers' issues since 2013: Haciendo la vida fácil a desarrolladores desde 2013.\ncommits: commits\nclosed issues: dudas resueltas\ncontributors: contribuyentes\nThe best!: El mejor!\nCompatible: Compatible\nEasy!: Fácil!\nSee in Codepen: Ver en Codepen\nTouch me!: Tócame!\nDesigned for mobiles and tablets, totally responsive: Diseñado para móviles y tablets, totalmente responsive\nBecause not only kids like to grab things: Porque no sólamente a los niños les gusta tocar cosas\n\n#MENU\nWordpress Theme: Plantilla Wordpress\nWordPress: WordPress\nExamples: Ejemplos\nPricing: Precio\nDocs: Documentación\nContact: Contacto\n\n#sections content\nProud of being the most complete framework of its kind: Orgulloso de ser el framework más completo de su categoría\nTrusted by the most innovative companies: Usado por las compañias más innovadoras\nWorking in modern and old browsers too!: Funcional en todo tipo de navegadores!\nMake a beautiful site for all! Not just a few!: Haz una página bonita para todos no solo para unos pocos!\njs is designed to be easy to use and customize: js está diseñado para ser fácil de usar y configurar\nIt includes tens of examples, great documentation and both community and personal support: Incluye decenas de ejemplos, una documentación increible y suporte tanto personal como de la comunidad\n\n#examples\nNavigation: Navegación\nScroll Bar Enabled: Con barra de desplazamiento\nNormal scrolling: Scroll normal\nContinuous vertical: Movimiento continuo vertical\nWithout anchor links (same URL): Sin enlaces de lanclaje (misma URL)\nVertical navigation dots: Círculos de navegación vertical\nHorizontal navigation dots: Círculos de navegación horizontal\nExtensions: Extensiones\nCards 3D: Cards 3D\nParallax: Parallax\nContinuous Horizontal: Horizontal infinito\nInterlocked Slides: Diapositivas conectadas\nReset Sliders: Reinicia diapositivas\nResponsive Slides: Diapositivas responsive\nScroll Horizontally: Desplazamiento horizontal\nFading Effect: Efecto desvanecer\nOffset Sections: Secciones porcentaje\nDrag And Move: Pincha y arrastra\nScrollOverflow Reset: Reinicia ScrollOverflow\nDesign: Diseño\nResponsive: Responsive\nFull backgrounds: Fondos a pantalla completa\nFull background videos: Vídeos a pantalla completa\nAuto-height sections: Secciones de altura ajustable\nGradient backgrounds: Fondos con degradado\nScrolling inside sections and slides: Desplazamiento interno en secciones\nAdding fixed header and footer: Cabecera y pie de página fijos\nOne single section: Una única sección\nOther: Otros\nAnimations on scrolling: Animaciones al desplazarse\nCallbacks: Callbacks\nFunctions and methods: Funciones y métodos\n\n#extras\ndocumentation-link: https://alvarotrigo.com/fullPage/docs/es/\ndocumentation-link-github: https://github.com/alvarotrigo/fullPage.js/tree/master/lang/spanish\nextensions-link: https://alvarotrigo.com/fullPage/extensions/es/\nlang: es\nflag-name: flag-spanish\nlanguage-name: Español\ncanonical-link: https://alvarotrigo.com/fullPage/es/\nlanguage-menu:\n      <li><a href=\"https://alvarotrigo.com/fullPage/\"><span class=\"flag flag-english\"></span>English</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/ko/\"><span class=\"flag flag-korean\"></span>한국어</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/ja/\"><span class=\"flag flag-japanese\"></span>日本語</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/ru/\"><span class=\"flag flag-russian\"></span>Pусский</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/zh/\"><span class=\"flag flag-chinese\"></span>中文</a></li>\n\n# Extensions website\nNeed some extra feature? Fullpage.js provides extensions that you can use to enhance its already amazing behavior!: Necesitas funcionalidad extra? Fullpage.js provee extensiones que puedes usar para mejorar su ya increible funcionamiento!\nParallax Backgrounds: Fondos Parallax\nCreates a parallax effect for the backgrounds of sections and slides when scrolling and sliding.: Crea efecto parallax para los fondos de seciones y diapositivas al desplazarse entre ellas.\nBuy: Comprar\nDemo: Demostración\n#ScrollOverflow Reset: ScrollOverflow Reset\nScrolls back the content of the section/slide with scroll bar when leaving it so it will always be at the start.: Desplaza el contenido de la diaposiva o sección con scrollOverflow a la posición de inicio al desplazarse a otra sección. De este modo estará siempre al principio.\n#Drag And Move: Drag And Move\nAllows to move between sections and slides by clicking and dragging the mouse as well as by swiping with fingers.: Permite desplazarse a través de secciones y diapositivas pinchando con el ratón y arrastrando así como deslizando los dedos en dispositivos táctiles.\n#Offset Sections: Offset Sections\nProvides a way to use non full screen sections based on percentage. Ideal to show visitors there's more content in the site by showing part of the next or previous section.: Permite usar secciones que no son a pantalla completa sino basadas en porcentajes. Ideal para mostrar que hay más contenido en la web dejando ver parte de las secciones contiguas.\n#Fading Effect: Fading Effect\nProvides a fading effect for vertical sections and horizontal slides or for any of them separately.: Provee un efecto de desvanecimiento para secciones verticales y diapositivas horizontales o para cualquiera de ellas por separado. (horizontal o vertical)\n#Responsive Slides: Responsive Slides\nAllows the turn of horizontal slides into vertical sections on responsive or by using external functions.: Permite convertir diapositivas horizontales en verticales en modo responsive o usando una función.\n#Continuous Horizontal: Continuous Horizontal\nProvides the continuous horizontal scrolling feature for all the sliders.: Provee el movimiento horizontal infinito para todas las diapositivas.\n#Interlocked Slides: Interlocked Slides\nProvides a way to force the moving of sliders in other sections when sliding the visible one.: Provee una forma de mover todas las diapositivas (o las de determinadas secciones) de forma sincronizada al mover las de la sección actual.\n#Scroll Horizontally: Scroll Horizontally\nProvides horizontal scroll within sliders by using the mouse wheel or trackpad. Ideal for story telling!: Provee desplazamiento horizontal para diapositivas usando la ruleta del ratón o el trackpad. Ideal para contar historias!\n#Reset Sliders: Reset Sliders\nForces fullpage.js to reset every slider after leaving its section. This way when the users goes back it will always be in the first slide of the slider.: Fuerza a que fullPage.js reinicie todas las diapositivas desplazarse a otra sección. Así cuando el usuario vuelve atrás verá siempre la primera diapositiva del carousel.\nWhich license should I use?: ¿Qué licencia debo usar?\nPrice varies depending on the extension: El precio varía dependiendo de la extensión\nFor up to 1 website: Para 1 página web\nHobby: Hobby\n1 domain: 1 dominio\nMinified source code: Código comprimido\nFree updates: Actualizaciones gratuitas\nOnly if no activation key was generated: Sólo si no se ha generado clave de activación\nLicense agreement: Acuerdo de licencia\nFor up to 5 websites: Hasta 5 páginas web\nProfessional: Profesional\nBest value!: Mejor valor!\n5 domains: 5 dominios\nFor unlimited websites: Ilimitadas páginas web\nBusiness: Business\nUnlimited Domains: Dominios ilimitados\nCommon activation key: Clave de activación común\nUse in SaaS product: Usar en applicaciones SaaS\nRefund: Reembolso\nUpdates: Actualizaciones\nStaging / dev domains: Dominios de desarrollo\nTrusted by the world’s most innovative companies: Usada por las compañías más innovadoras del mundo\nPeople love fullPage.js!: La gente ama fullPage.js!\nVertical Navigation: Navegación vertical\nAdd the stylesheet after fullpage.css and... that's it!: Incluye la hoja de estilos después de fullpage.css y... eso es todo!\nAvailable in 2 sizes: Disponible en 2 idiomas\nGet all navigation styles from £9: Consigue todos los estilos de navegación por £9\nSubscribe: Subscríbete\nGet notified of new extensions or fullpage.js relevant announcements.: Mantente informado de nuevas extensiones o de anuncios relevantas de fullPage.js.\nActivation Key per Domain: Clave de activación por cada dominio\nGenerate only 1 activation key. No dev/staging domains possible.: Genera 1 sola clave de activación. Sin dominios de desarrollo.\nOnly if no activation key was generated.: Solo si no se ha generado ninguna clave de activación.\nRead the license refund terms: Lee los términos de reembolso de la licencia\nIsolated reproductions might be required.: Puede ser requerida una reproducción aislada.\nRead the license support terms: Lee los términos de soporte de la licencia\nGenerate up to 5 activation keys. Dev/staging domains included.: Genera hasta 5 claves de activación. Incluyendo dominios de desarrollo.\n30-Day Money Back Guarrantee: 30 días de garantía asegurada\n1 month support: 1 mes de soporte\n6 months support: 6 meses de soporte\nUnlimited support: Soporte ilimitado\nRedistribute: Redistribuible\nWithin a product: en un producto\nMobile applications: Aplicaciones móviles\nGot questions? Check the: ¿Tienes preguntas? Mira las\n30-days money back guaranteed for any purchase under the conditions detailed in the License Agreement: 30 días de reembolso asegurados para cualquier compra bajo las condiciones detalladas en el acuerdo de licencia\nfullPage.js Refund Terms: Términos de reembolso de fullPage.js\nYour email address: Tu email\nAll licenses include free updates for the purchased license and buyers will be notified by mail of new releases.: Todas las licencias incluyen actualizaciones gratuitas y los compradores serán notificados por email de nuevas versiones.\nUpon request: Bajo petición\nnew activation keys can be provided for staging or developing domains to a maximum of 3.: Dominios de desarrollo podrán optar a un máximo de 3 claves de activación.\nNo activation key is necessary for `localhost` and `127.0.0.1`.: No se necesta clave de activación para `localhost` y `127.0.0.1`.\nAny other staging domains will require a license (Professional or Business) that allows to generate a new key for those.: Cualquier otro dominio de desarrollo requerirá una licencia (Profesional or Business) que permita generar nuevas claves de activación para ellos.\n\n#extensions bundle:\nAll extensions bundle: Pack completo\nGet all the extensions starting from $119!: Consigue todas las extensiones desde $119!\nIncluding future ones!: Incluyendo las que vayan saliendo!\nGet the extensions pack!: Quiero el pack completo!\n\nlanguage-menu-extensions:\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/\"><span class=\"flag flag-english\"></span>English</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/ru/\"><span class=\"flag flag-russian\"></span>Pусский</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/ko/\"><span class=\"flag flag-korean\"></span>한국어</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/zh/\"><span class=\"flag flag-chinese\"></span>中文</a></li>\n"
  },
  {
    "path": "lang/website/fr.yml",
    "content": "#Page meta data\ntitle: fullPage.js | Plugin pour site web d'une page de défilement des sections\ndescription: plugin fullPage par Alvaro Trigo. Créez des pages plein écran rapidement et simplement. Plugin jquery de sections de défilement d'une page. Clic souris.\nkeywords: fullpage,jquery,alvaro,trigo,plugin,fullscren,screen,full,iphone5,snap,snapping,apple,scroll,sections\nog-title: fullPage scroll snapping. Create full screen pages fast and simple\nog-description: La molette de la souris s'enclenche sur les sections. Rapide et simple à utiliser.\ntwitter-description: Grande bibliothèque Javascript pour créer des sites Web à défilement plein écran\n\n#Sections content\nCreate Beautiful Fullscreen Scrolling Websites: Créez de superbes sites Web déroulants en plein écran\nDownload: Télécharger\nView on GitHub: Vue sur GitHub\nOpen: Ouvrir\nfullPage.js is actively mantained and community driven.: fullPage.js est activement entretenu et géré par la communauté.\nSolving developers' issues since 2013.: Résous les problèmes des développeurs depuis 2013.\ncommits: commits\nclosed issues: problèmes fermés\ncontributors: contributeurs\nThe best!: Le meilleur !\nCompatible: Compatible\nEasy!: Facile!\nSee in Codepen: Voir dans Codepen\nTouch me!: Touche-moi!\nDesigned for mobiles and tablets, totally responsive.: Conçu pour les mobiles et les tablettes, totalement responsive.\nBecause not only kids like to grab things.: Parce que non seulement les enfants aiment attraper des choses.\n\n#menu\nWordpress Theme: Thème Wordpress\nWordPress: WordPress\nExamples: Exemples d'applications\nPricing: Tarification\nDocs: Docs\nContact: Contact\n\n#sections content\nProud of being the most complete framework of its kind.: Fier d'être le cadre le plus complet du genre.\nTrusted by the most innovative companies.: Confiance des entreprises les plus innovantes.\nWorking in modern and old browsers too! Even IE 9!: Fonctionne aussi bien avec les navigateurs modernes qu'avec les anciens ! Même IE 9 !\nMake a beautiful site for all! Not just a few!: Faites un beau site pour tous ! Pas seulement quelques-uns !\nfullPage.js is designed to be easy to use and customize.: fullPage.js est conçu pour être facile à utiliser et à personnaliser.\nIt inludes tens of examples, great documentation and both community and personal support.: Il comprend des dizaines d'exemples, une excellente documentation et un soutien à la fois communautaire et personnel.\n\n#sections content\nNavigation: Navigation\nScroll Bar Enabled: Barre de défilement activée\nNormal scrolling: Défilement normal\nContinuous vertical: Verticale continue\nWithout anchor links (same URL): Sans liens d'ancrage (même URL)\nVertical navigation dots: Points de navigation verticale\nHorizontal navigation dots: Points de navigation horizontale\nExtensions: Extensions\nCards 3D: Cartes 3D\nParallax: Parallax\nContinuous Horizontal: En continu Horizontal\nInterlocked Slides: Diapositives entrelacées\nReset Sliders: Réinitialiser les curseurs\nResponsive Slides: Diapositives responsives\nScroll Horizontally: Défilement horizontal\nFading Effect: Effet de décoloration\nOffset Sections: Sections décalées\nDrag And Move: Glisser et déplacer\nScrollOverflow Reset: Réinitialisation de ScrollOverflow\nDesign: Design\nResponsive: Responsive\nFull backgrounds: Fonds d'écran complets\nFull background videos: Vidéos d'arrière-plan complètes\nAuto-height sections: Hauteurs automatiques\nGradient backgrounds: Fonds d'écran en dégradé\nScrolling inside sections and slides: Défilement à l'intérieur des sections et des diapositives\nAdding fixed header and footer: Ajout d'un en-tête et d'un pied de page fixes\nOne single section: Une seule section\nOther: Autre\nAnimations on scrolling: Animations sur le défilement\nCallbacks: Callbacks\nFunctions and methods: Fonctions et méthodes\n\ndocumentation-link: https://github.com/alvarotrigo/fullPage.js/#fullpagejs\nextensions-link: https://alvarotrigo.com/fullPage/extensions/\nlang: fr\nflag-name: flag-french\nlanguage-name: French\ncanonical-link: https://alvarotrigo.com/fullPage/\nlanguage-menu:\n      <li><a href=\"https://alvarotrigo.com/fullPage/ru/\"><span class=\"flag flag-russian\"></span>Pусский</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/ko/\"><span class=\"flag flag-korean\"></span>한국어</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/es/\"><span class=\"flag flag-spanish\"></span>Español</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/zh/\"><span class=\"flag flag-chinese\"></span>中文</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/fr/\"><span class=\"flag flag-french\"></span>Français</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/br/\"><span class=\"flag flag-brazilian\"></span>Português Brasileiro</a></li>\n\n\n# Extensions website\nNeed some extra feature? Fullpage.js provides extensions that you can use to enhance its already amazing behavior!: Besoin d'une fonctionnalité supplémentaire ? Fullpage.js fournit des extensions que vous pouvez utiliser pour améliorer son comportement déjà étonnant !\nParallax Backgrounds: Fonds d'écran Parallax\nCreates a parallax effect for the backgrounds of sections and slides when scrolling and sliding.: Crée un effet de parallaxe pour les fonds de sections et de diapositives lors du défilement et du glissement.\nBuy : Acheter\nDemo: Demo\n#ScrollOverflow Reset: ScrollOverflow Reset\nScrolls back the content of the section/slide with scroll bar when leaving it so it will always be at the start.: Fait défiler le contenu de la section/glissière vers l'arrière avec la barre de défilement lorsque vous la quittez pour qu'elle soit toujours au début.\n#Drag And Move: Drag And Move\nAllows to move between sections and slides by clicking and dragging the mouse as well as by swiping with fingers.: Permet de se déplacer entre les sections et les diapositives en cliquant et en faisant glisser la souris ainsi qu'en glissant avec les doigts.\n#Offset Sections: Offset Sections\nProvides a way to use non full screen sections based on percentage. Ideal to show visitors there's more content in the site by showing part of the next or previous section.: Permet d'utiliser des sections qui ne sont pas en plein écran en fonction d'un pourcentage. Idéal pour montrer aux visiteurs qu'il y a plus de contenu dans le site en montrant une partie de la section suivante ou précédente.\n#Fading Effect: Fading Effect\nProvides a fading effect for vertical sections and horizontal slides or for any of them separately.: Fournit un effet de fondu pour les sections verticales et les diapositives horizontales ou pour chacune d'entre elles séparément.\n#Responsive Slides: Responsive Slides\nAllows the turn of horizontal slides into vertical sections on responsive or by using external functions.: Permet de faire pivoter les glissières horizontales en sections verticales en réponse ou à l'aide de fonctions externes.\n#Continuous Horizontal: Continuous Horizontal\nProvides the continuous horizontal scrolling feature for all the sliders.: Permet le défilement horizontal continu de tous les curseurs.\n#Interlocked Slides: Interlocked Slides\nProvides a way to force the moving of sliders in other sections when sliding the visible one.: Permet de forcer le déplacement des curseurs dans d'autres sections lors du glissement de celui qui est visible.\n#Scroll Horizontally: Scroll Horizontally\nProvides horizontal scroll within sliders by using the mouse wheel or trackpad. Ideal for story telling!: Permet de faire défiler horizontalement les curseurs à l'aide de la molette de la souris ou du pavé tactile. Idéal pour raconter des histoires !\n#Reset Sliders: Reset Sliders\nForces fullpage.js to reset every slider after leaving its section. This way when the users goes back it will always be in the first slide of the slider.: Force fullpage.js à réinitialiser chaque curseur après avoir quitté sa section. De cette façon, lorsque l'utilisateur revient en arrière, il sera toujours dans la première diapositive du curseur.\nWhich license should I use?: Quelle licence dois-je utiliser ?\nFor up to 1 website: Jusqu'à 1 site Web\nHobby: Hobby\n1 domain: 1 domaine\nMinified source code: Code source miniature\nFree updates: Mises à jour gratuites\nLicense agreement: Contrat de licence\nFor up to 5 websites: Jusqu'à 5 sites Web\nProfessional: Professionnel\nBest value!: Meilleur rapport qualité/prix !\n5 domains: 5 domaines\nFor unlimited websites: Pour un nombre illimité de sites Web\nBusiness: Entreprises\nUnlimited Domains: Domaines illimités\nCommon activation key: Clé d'activation commune\nUse in SaaS product: Utilisation dans le produit SaaS\nRefund: Remboursement\nUpdates: Mises à jour\nStaging / dev domains: Domaines staging / dev\nTrusted by the world’s most innovative companies: Confiance des entreprises les plus innovantes du monde\nPeople love fullPage.js!: Les gens adorent fullPage.js !\nVertical Navigation: Navigation verticale\nAdd the stylesheet after jquery.fullpage.css and... that's it!: Ajoutez la feuille de style après jquery.fullpage.css et... c'est tout !\nAvailable in 2 sizes: Disponible en 2 tailles\nGet all navigation styles from Â£9: Obtenez tous les styles de navigation à partir de Â£9\n30-Day Money Back Guarrantee: Garantie de remboursement de 30 jours\nSubscribe: S'abonner\nGet notified of new extensions or fullpage.js relevant announcements.: Soyez informé des nouvelles extensions ou des annonces pertinentes de fullpage.js.\nActivation Key per Domain: Clé d'activation par domaine\nOnly if no activation key was generated.: Uniquement si aucune clé d'activation n'a été générée.\nRead the license refund terms: Lire les conditions de remboursement de la licence\n1 month support: 1 mois de support\nIsolated reproductions might be required.: Des reproductions isolées peuvent être requises.\nRead the license support terms: Lire les conditions de support de la licence\n6 months support: 6 mois de support\nUnlimited support: Support prioritaire illimité\nRedistribute: Redistribuer\nGot questions? Check the: Vous avez des questions ? Vérifiez le\n30-days money back guaranteed for any purchase under the conditions detailed in the License Agreement: Remboursement de 30 jours garanti pour tout achat selon les conditions détaillées dans le contrat de licence.\nfullPage.js Refund Terms: Conditions de remboursement de fullPage.js\nAll licenses include free updates for the purchased license and buyers will be notified by mail of new releases.: Toutes les licences incluent des mises à jour gratuites pour la licence achetée et les acheteurs seront informés par courrier des nouvelles versions.\nUpon request: Sur demande\nnew activation keys can be provided for staging or developing domains to a maximum of 3.: de nouvelles clés d'activation peuvent être fournies pour la mise en place ou le développement de domaines jusqu'à un maximum de 3.\nNo activation key is necessary for `localhost` and `127.0.0.1`.: Aucune clé d'activation n'est nécessaire pour localhost et 127.0.0.0.1.\nAny other staging domains will require a license (Professional or Business) that allows to generate a new key for those.: Tout autre domaine de staging nécessitera une licence (Professionnel ou Business) qui permettra de générer une nouvelle clé pour ceux-ci.\nYour email address: Votre adresse email\nGenerate only 1 activation key. No dev/staging domains possible.: Générer une seule clé d'activation. Aucun domaine de développement ou de mise en valeur n'est possible.\nPrice varies depending on the extension: Le prix varie en fonction de l'extension\nGenerate up to 5 activation keys. Dev/staging domains included.: Générer jusqu'à 5 clés d'activation. Domaines de développement/staging inclus.\nGenerate a common activation key: Générer une clé d'activation commune\nWithin a product: Dans un produit\nMobile applications: Applications mobiles\n\nlanguage-menu-extensions:\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/ru/\"><span class=\"flag flag-russian\"></span>Pусский</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/ko/\"><span class=\"flag flag-korean\"></span>한국어</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/es/\"><span class=\"flag flag-spanish\"></span>Español</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/zh/\"><span class=\"flag flag-chinese\"></span>中文</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/fr/\"><span class=\"flag flag-french\"></span>Français</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/br/\"><span class=\"flag flag-brazilian\"></span>Português Brasileiro</a></li>\n"
  },
  {
    "path": "lang/website/ja.yml",
    "content": "# Page meta data\ntitle: fullPage.js | 全画面スクロールセクションサイトプラグイン\ndescription: Alvaro TrigoによるfullPageプラグイン。フルスクリーンページを素早く簡単に作成します。ワンページスクロールセクションのjQueryプラグイン。マウススナップ\nkeywords: fullpage,jquery,alvaro,trigo,plugin,fullscreen,screen,full,iphone5,snap,snapping,apple,scroll,sections\nog-title: fullPage スクロールスナッピング。フルスクリーンページを素早く簡単に作成\nog-description: マウスホイールでセクションを移動します。使いやすく、迅速です\ntwitter-description: フルスクリーンのスクロールウェブサイトを作成するための優れたJavaScriptライブラリ\n\n# Sections content\nCreate Beautiful Fullscreen Scrolling Websites: 美しいフルスクリーンスクロールウェブサイトを作成ライブラリ\nDownload: ダウンロード\nView on GitHub: GitHubを見る\nOpen: Open\njs is actively maintained and community driven: jsは活発にメンテナンスされており、コミュニティ主導です\nSolving developers' issues since 2013: 2013年から活発に開発され続けています\ncommits: コミット\nclosed issues: クローズドイシュー\ncontributors: 貢献者\nThe best!: 最高峰\nCompatible: 優れた互換性\nEasy!: Easy!\nSee in Codepen: Codepenで見る\nTouch me!: Touch me!\nDesigned for mobiles and tablets, totally responsive: モバイルとタブレット向けにデザインされており、完全にレスポンシブです\nBecause not only kids like to grab things: 子供だけでなく、大人も物を掴みたくなるからです\n\n# menu\nWordpress Theme: Wordpressテーマ\nWordPress: WordPress\nExamples: 例\nPricing: 価格\nDocs: ドキュメント\nContact: お問い合わせ\n\n# sections content\nProud of being the most complete framework of its kind: 最も完全なフレームワークであることを誇りに思っています\nTrusted by the most innovative companies: 最も革新的な企業に信頼されています\nWorking in modern and old browsers too!: 現代のブラウザだけでなく、古いブラウザでも動作します！\nMake a beautiful site for all! Not just a few!: すべてのユーザーのために美しいサイトを作成！ \njs is designed to be easy to use and customize: jsは使いやすく、カスタマイズしやすいように設計されています\nIt includes tens of examples, great documentation and both community and personal support: 多彩な例、素晴らしいドキュメント、そしてコミュニティと個別サポートに対応しております\n\n# sections content\nNavigation: ナビゲーション\nScroll Bar Enabled: スクロールバーが有効\nNormal scrolling: 通常のスクロール\nContinuous vertical: 縦方向に連続\nWithout anchor links (same URL): アンカーリンクなし（同じURL）\nVertical navigation dots: 縦方向のナビゲーションドット\nHorizontal navigation dots: 横方向のナビゲーションドット\nExtensions: 拡張機能\nCards 3D: 3Dカード\nParallax: パララックス\nContinuous Horizontal: 横方向に連続\nInterlocked Slides: 連携スライド\nReset Sliders: スライダーのリセット\nResponsive Slides: レスポンシブスライド\nScroll Horizontally: 横方向スクロール\nFading Effect: フェード効果\nOffset Sections: オフセットセクション\nDrag And Move: ドラッグ＆ムーブ\nScrollOverflow Reset: スクロールオーバーフローのリセット\nDesign: デザイン\nResponsive: レスポンシブ\nFull backgrounds: フル背景\nFull background videos: フル背景動画\nAuto-height sections: 自動高さセクション\nGradient backgrounds: グラデーション背景\nScrolling inside sections and slides: セクションとスライド内でのスクロール\nAdding fixed header and footer: 固定ヘッダーとフッターの追加\nOne single section: 単一セクション\nOther: その他\nAnimations on scrolling: スクロール時のアニメーション\nCallbacks: コールバック\nFunctions and methods: 関数とメソッド\ndocumentation-link: https://alvarotrigo.com/fullPage/docs/ja/\ndocumentation-link-github: https://github.com/alvarotrigo/fullPage.js/tree/master/lang/japanese\n\nextensions-link: https://alvarotrigo.com/fullPage/extensions/\nlang: ja\nflag-name: flag-japanese\nlanguage-name: 日本語\ncanonical-link: https://alvarotrigo.com/fullPage/ja/\nlanguage-menu:\n      <li><a href=\"https://alvarotrigo.com/fullPage/\"><span class=\"flag flag-english\"></span>English</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/ko/\"><span class=\"flag flag-korean\"></span>한국어</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/ru/\"><span class=\"flag flag-russian\"></span>Pусский</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/es/\"><span class=\"flag flag-spanish\"></span>Español</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/zh/\"><span class=\"flag flag-chinese\"></span>中文</a></li>\n      \n# Extensions website\nNeed some extra feature? Fullpage.js provides extensions that you can use to enhance its already amazing behavior!: 追加機能をお探しですか？ fullpage.jsは、モダンで多彩な拡張機能を提供しています！\nParallax Backgrounds: パララックス背景\nCreates a parallax effect for the backgrounds of sections and slides when scrolling and sliding: スクロールやスライド時にセクションとスライドの背景にパララックス効果を作成します\nBuy: 購入\nDemo: デモ\n# ScrollOverflow Reset: スクロールオーバーフローのリセット\nScrolls back the content of the section/slide with scroll bar when leaving it so it will always be at the start: セクション/スライドを離れるとスクロールバーでコンテンツを戻し、常に開始位置に保ちます\n# Drag And Move: ドラッグ＆ムーブ\nAllows to move between sections and slides by clicking and dragging the mouse as well as by swiping with fingers: マウスをクリックしてドラッグすることや指でスワイプすることで、セクションやスライド間を移動できます\n# Offset Sections: オフセットセクション\nProvides a way to use non full screen sections based on percentage. Ideal to show visitors there's more content in the site by showing part of the next or previous section: パーセンテージに基づいてフルスクリーンでないセクションを使用する方法を提供します。次のセクションや前のセクションの一部を表示することで、サイトにもっとコンテンツがあることを訪問者に示すのに最適です\n# Fading Effect: フェード効果\nProvides a fading effect for vertical sections and horizontal slides or for any of them separately: 縦方向のセクションや横方向のスライド、またはそれぞれの効果にフェード効果を提供します\n# Responsive Slides: レスポンシブスライド\nAllows the turn of horizontal slides into vertical sections on responsive or by using external functions: 横方向のスライドをレスポンシブで縦方向のセクションに変えることや外部機能を使用して変えることができます\n# Continuous Horizontal: 横方向に連続\nProvides the continuous horizontal scrolling feature for all the sliders: すべてのスライダーに対して連続横方向スクロール機能を提供します\n# Interlocked Slides: 連携スライド\nProvides a way to force the moving of sliders in other sections when sliding the visible one: 表示されているスライドをスライドさせるときに、他のセクションのスライダーも動かす方法を提供します\n# Scroll Horizontally: 横方向にスクロール\nProvides horizontal scroll within sliders by using the mouse wheel or trackpad. Ideal for story telling!: マウスホイールやトラックパッドを使用してスライダー内で横方向にスクロールします。ストーリーテリングに最適です！\n# Reset Sliders: スライダーのリセット\nForces fullpage.js to reset every slider after leaving its section. This way when the user goes back it will always be in the first slide of the slider: fullpage.jsがセクションを離れた後にすべてのスライダーをリセットさせます。このように、ユーザーが戻ると常にスライダーの最初のスライドに戻ります\nWhich license should I use?: ライセンスについて\nFor up to 1 website: 最大1つのウェブサイト用\nHobby: ホビー\n1 domain: 1ドメイン\nMinified source code: ミニファイされたソースコード\nFree updates: 無料アップデート\nLicense agreement: ライセンス契約\nFor up to 5 websites: 最大5つのウェブサイト用\nProfessional: プロフェッショナル\nBest value!: 一番人気です！\n5 domains: 5ドメイン\nFor unlimited websites: 無制限のウェブサイト用\nBusiness: ビジネス\nUnlimited Domains: 無制限のドメイン\nCommon activation key: 共通のアクティベーションキー\nUse in SaaS product: SaaS製品で使用\nRefund: 返金\nUpdates: アップデート\nStaging / dev domains: ステージング / 開発環境 ドメイン\nTrusted by the world’s most innovative companies: 世界で最も革新的な企業に信頼されています\nPeople love fullPage.js!: 人々はfullPage.jsを愛しています！\nVertical Navigation: 縦方向のナビゲーション\nAdd the stylesheet after fullpage.css and... that's it!: fullpage.cssの後にスタイルシートを追加するだけで利用できます！\nAvailable in 2 sizes: 2サイズで利用可能\nGet all navigation styles from Â£9: すべてのナビゲーションスタイルを£9から取得\n30-Day Money Back Guarantee: 30日間の返金保証\nSubscribe: 購読\nGet notified of new extensions or fullpage.js relevant announcements: 新しい拡張機能やfullpage.jsに関する通知を受け取る\nActivation Key per Domain: ドメインごとのアクティベーションキー\nOnly if no activation key was generated: アクティベーションキーが生成されていない場合のみ\nRead the license refund terms: ライセンスの返金条件を読む\n1 month support: 1ヶ月のサポート\nIsolated reproductions might be required: 独立した症状再現が必要になる場合があります\nRead the license support terms: ライセンスのサポート条件を読む\n6 months support: 6ヶ月のサポート\nUnlimited support: 優先無制限サポート\nRedistribute: 再配布\nGot questions? Check the: 質問がありますか？チェックしてください\n30-days money back guaranteed for any purchase under the conditions detailed in the License Agreement: ライセンス契約に記載された条件下での購入には30日間の返金保証があります\nfullPage.js Refund Terms: fullPage.js 返金条件\nAll licenses include free updates for the purchased license and buyers will be notified by mail of new releases: すべてのライセンスには購入したライセンスの無料アップデートが含まれており、新しいリリースについてはメールで通知されます\nUpon request: 要請に応じて\nnew activation keys can be provided for staging or developing domains to a maximum of 3: ステージングまたは開発環境用ドメインに最大3つの新しいアクティベーションキーが提供可能です\nNo activation key is necessary for `localhost` and `127.0.0.1`: localhost および`127.0.0.1`にはアクティベーションキーは必要ありません\nAny other staging domains will require a license (Professional or Business) that allows to generate a new key for those: 他のステージングドメインには、それ用の新しいキーを生成することを許可するライセンス（プロフェッショナルまたはビジネス）が必要です\nYour email address: あなたのメールアドレス\nGenerate only 1 activation key. No dev/staging domains possible: 1つのアクティベーションキーのみ生成します。開発/ステージング環境用ドメインはありません\nPrice varies depending on the extension: 価格は拡張機能によって異なります\nGenerate up to 5 activation keys. Dev/staging domains included: 最大5つのアクティベーションキーを生成します。開発/ステージング環境用ドメインを含む\nGenerate a common activation key: 共通のアクティベーションキーを生成\nWithin a product: 製品内で\nMobile applications: モバイルアプリケーション\n\n#extensions bundle:\nAll extensions bundle: すべての拡張機能バンドル\nGet all the extensions starting from $119!: $119から始まるすべての拡張機能を入手！\nIncluding future ones!: 将来のものも含む！\nGet the extensions pack!: 拡張機能パックを入手！\n\nlanguage-menu-extensions:\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/ru/\"><span class=\"flag flag-russian\"></span>Pусский</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/ko/\"><span class=\"flag flag-korean\"></span>한국어</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/es/\"><span class=\"flag flag-spanish\"></span>Español</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/zh/\"><span class=\"flag flag-chinese\"></span>中文</a></li>\n"
  },
  {
    "path": "lang/website/ko.yml",
    "content": "#page meta data - just translate the 2nd part, the part after the semicolon \":\"\ntitle: fullPage.js | 한 페이지 스크롤 구역 사이트 플러그인\ndescription: Alvaro 제작 플러그인. 전체화면 페이지를 빠르고 손쉽게 만듭니다. 한 페이지 스크롤 구역. 마우스 스냅.\nkeywords: 전체화면, 화면, 전체, 스냅, 스냅핑, 스크롤, 구역\nog-title: fullPage 스크롤 스냅핑. 전체 화면 페이지를 빠르고 간편하게 만들어 보세요\nog-description: 구역과 슬라이드를 스냅하는 끝내주는 라이브러리입니다. 빠르고 간편합니다.\ntwitter-description: 전체화면 스크롤 웹사이트를 만드는 훌륭한 자바스크립트 라이브러리입니다.\n\n#Sections content\nCreate Beautiful Fullscreen Scrolling Websites: 멋있는 전체화면 스크롤 웹사이트를 만들어 보세요\nDownload: 다운로드\nView on GitHub: GitHub에서 보기\nOpen: 열려 있어요\nfullPage: fullPage\njs is actively maintained and community driven: js는 활발하게 유지보수되며 공동체 중심입니다\nSolving developers' issues since 2013: 2013년부터 개발자가 맞닥뜨리는 문제를 해결하고 있습니다\ncommits: commits\nclosed issues: 해결된 문제\ncontributors: 기여자\nThe best!: 단연 최고!\nCompatible: 훌륭한 호환성\nEasy!: 쉬워요!\nSee in Codepen: Codepen에서 보기\nTouch me!: 만져보세요!\nDesigned for mobiles and tablets, totally responsive: 모바일 기기와 태블릿에서 완전히 반응하도록 설계되었습니다\nBecause not only kids like to grab things: 누구나 아이처럼 신나게 만지고 싶으니까요\n\n#MENU\nWordpress Theme: 워드프레스 테마\nWordPress: 워드프레스 \nExamples: 예시\nPricing: 가격\nDocs: 설명서\nContact: 문의\n\n#Sections content\nProud of being the most complete framework of its kind: 가장 완성된 틀임을 자부심 있게 선언합니다\nTrusted by the most innovative companies: 혁신의 선두를 달리는 기업에게 신뢰받고 있습니다\nWorking in modern and old browsers too!: 최신 브라우저뿐만 아니라 예전 버전에서도 작동합니다.\nMake a beautiful site for all! Not just a few!: 소수가 아닌 모두를 위한 멋진 웹사이트를 만들어 보세요!\njs is designed to be easy to use and customize: js는 쉽게 사용하고 맞춤 설정할 수 있도록 고안되었습니다\nIt includes tens of examples, great documentation and both community and personal support: 수십 가지 예시, 훌륭한 문서화, 탁월한 개인 및 공동체 지원을 자랑합니다\n\n# EXAMPLES\nNavigation: 이동\nScroll Bar Enabled: 스크롤 막대 활성화됨\nNormal scrolling: 정상 스크롤\nContinuous vertical: 연속 수직\nWithout anchor links (same URL): 앵커 링크가 없음 (동일 URL)\nVertical navigation dots: 수직 이동 점\nHorizontal navigation dots: 수평 이동 점\nExtensions: 확장 프로그램\nCards 3D: Cards 3D\nParallax: Parallax\nContinuous Horizontal: 연속 수평\nInterlocked Slides: 맞물려 이동하는 슬라이드\nReset Sliders: 슬라이더 초기화\nResponsive Slides: 반응형 슬라이드\nScroll Horizontally: 수평으로 스크롤하기\nFading Effect: 페이딩 효과\nOffset Sections: 엿보기 구역\nDrag And Move: 끌어서 슬라이드 움직이기\nScrollOverflow Reset: ScrollOverflow Reset\nDesign: 디자인\nResponsive: 반응형\nFull backgrounds: 전체 배경\nFull background videos: 전체 배경 비디오\nAuto-height sections: 자동 높이 구역\nGradient backgrounds: 그라데이션 배경\nScrolling inside sections and slides: 구역 및 슬라이드 내부에서 스크롤\nAdding fixed header and footer: 고정된 머리말과 꼬리말 추가\nOne single section: 단일 구역\nOther: 기타\nAnimations on scrolling: 스크롤 애니메이션\nCallbacks: 콜백\nFunctions and methods: 기능과 방법\n\ndocumentation-link: https://alvarotrigo.com/fullPage/docs/ko/\ndocumentation-link-github: https://github.com/alvarotrigo/fullPage.js/tree/master/lang/korean\nextensions-link: https://alvarotrigo.com/fullPage/extensions/ko/\nlang: ko\nflag-name: flag-korean\nlanguage-name: 한국어\ncanonical-link: https://alvarotrigo.com/fullPage/ko/\nlanguage-menu:\n      <li><a href=\"https://alvarotrigo.com/fullPage/\"><span class=\"flag flag-english\"></span>English</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/ja/\"><span class=\"flag flag-japanese\"></span>日本語</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/ru/\"><span class=\"flag flag-russian\"></span>Pусский</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/es/\"><span class=\"flag flag-spanish\"></span>Español</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/zh/\"><span class=\"flag flag-chinese\"></span>中文</a></li>\n\n\n\n# Extensions website\nNeed some extra feature? Fullpage.js provides extensions that you can use to enhance its already amazing behavior!: 추가 기능이 필요하신가요? Fullpage.js가 지원하는 끝내주는 효과를 한층 더 끌어올릴 수 있는 확장 프로그램을 만나보세요!\nParallax Backgrounds: Parallax 배경\nCreates a parallax effect for the backgrounds of sections and slides when scrolling and sliding.: 스크롤 및 수평으로 넘기는 도중 구역과 슬라이드의 배경에 Parallax 효과를 만듭니다.\nBuy: 구매하기\nDemo: 데모\n#ScrollOverflow Reset:\nScrolls back the content of the section/slide with scroll bar when leaving it so it will always be at the start.: 구역/슬라이드를 떠날 때 스크롤 바를 통해 컨텐츠의 처음으로 돌아가서 항상 시작점에서 시작되도록 합니다.\n#Drag And Move:\nAllows to move between sections and slides by clicking and dragging the mouse as well as by swiping with fingers.: 마우스로 클릭해서 끌어오거나 손가락으로 넘겨서 구역과 슬라이드 사이를 이동할 수 있게 합니다.\n#Offset Sections:\nProvides a way to use non full screen sections based on percentage. Ideal to show visitors there's more content in the site by showing part of the next or previous section.: 전체화면이 아닌, 퍼센트에 따라 정해지는 일부 화면 구역을 쓸 수 있는 방법을 지원합니다. 웹사이트 방문자에게 다음 또는 이전 구역의 일부를 보여줌으로써 컨텐츠가 더 있음을 보여주고자 할 때 적합합니다.\n#Fading Effect:\nProvides a fading effect for vertical sections and horizontal slides or for any of them separately.: 수직 구역과 수평 슬라이드 또는 일부만 따로 사라지는 효과를 만듭니다.\n#Responsive Slides:\nAllows the turn of horizontal slides into vertical sections on responsive or by using external functions.: 반응형 또는 외부 기능을 써서 수평 슬라이드가 수직 구역으로 전환되도록 합니다.\n#Continuous Horizontal:\nProvides the continuous horizontal scrolling feature for all the sliders.: 모든 슬라이더에 연속 수평 스크롤 기능을 지원합니다.\n#Interlocked Slides:\nProvides a way to force the moving of sliders in other sections when sliding the visible one.: 눈에 보이는 슬라이더를 수평으로 넘길 때 다른 구역에 있는 슬라이더를 강제로 움직이게 합니다.\n#Scroll Horizontally:\nProvides horizontal scroll within sliders by using the mouse wheel or trackpad. Ideal for story telling!: 마우스 휠이나 트랙 패드를 써서 슬라이더 내부에서 수평 스크롤을 할 수 있습니다. 이야기 전달에 적합합니다!\n#Reset Sliders:\nForces fullpage.js to reset every slider after leaving its section. This way when the users goes back it will always be in the first slide of the slider.: 슬라이더가 구역을 떠난 뒤 fullpage.js가 모든 슬라이더를 강제로 재설정하도록 합니다. 이렇게 하여 사용자가 다시 돌아갈 경우 항상 슬라이더의 첫번째 슬라이드에 가도록 합니다.\nWhich license should I use?: 어느 라이선스를 써야 하나요?\nFor up to 1 website: 웹사이트 최대 한 곳\nHobby: 취미\n1 domain: 도메인 한 곳\nMinified source code: 최소화된 소스 코드\nFree updates: 무료 업데이트\nLicense agreement: 라이선스 계약\nFor up to 5 websites: 웹사이트 최대 다섯 곳\nProfessional: Professional\nBest value!: 최고의 가치!\n5 domains: 도메인 5곳\nFor unlimited websites: 웹사이트 무제한\nBusiness: Business\nUnlimited Domains: 도메인 무제한\nCommon activation key: 공동 활성화 키\nUse in SaaS product: SaaS 제품 내 사용\nRefund: 환불\nUpdates: 업데이트\nStaging / dev domains: 시범(staging) / 개발 도메인\nTrusted by the world’s most innovative companies: 세계에서 혁신의 선두를 걷는 기업들로부터 신뢰받고 있습니다\nPeople love fullPage.js!: 사람들에게 사랑받는 fullPage.js!\nVertical Navigation: 수직 이동\nAdd the stylesheet after fullpage.css and... that's it!: fullpage.css 뒤에 스타일쉬트를 추가하시면... 바로 그거에요!\nAvailable in 2 sizes: 두 가지 크기로 이용 가능\nGet all navigation styles from Â£9: £9로 모든 이동 스타일을 얻으세요\n30-Day Money Back Guarrantee: 30일 내 환불 보장\nSubscribe: 구독\nGet notified of new extensions or fullPage.js relevant announcements.: 새로운 확장 프로그램이나 fullpage.js 관련 공지사항 알림을 받으세요.\nActivation Key per Domain: 각 도메인마다 활성화 키\nOnly if no activation key was generated.: 활성화 키가 생성되지 않았을 경우에만 해당.\nRead the license refund terms: 라이선스 환불 조건을 읽어보시기 바랍니다\n1 month support: 1개월 지원\nIsolated reproductions might be required.: 고립된 복제가 필요할 수 있습니다.\nRead the license support terms: 라이선스 지원 조건을 읽어보시기 바랍니다\n6 months support: 6개월 지원\nUnlimited support: 무제한 지원\nRedistribute: 재배포\nGot questions? Check the: 궁금한 점이 있나요? FAQ를 확인해 보세요\n30-days money back guaranteed for any purchase under the conditions detailed in the License Agreement: 라이선스 계약에 나온 조건에 부합하는 경우 모든 구매에는 30일 환불 보장이 적용됩니다\nfullPage.js Refund Terms: fullPage.js 환불 조건\nAll licenses include free updates for the purchased license and buyers will be notified by mail of new releases.: 모든 라이선스에는 구매된 라이선스를 위한 무료 업데이트가 들어가며, 구매자는 신규 출시시 통보를 받게 됩니다.\nUpon request: 요청시\nnew activation keys can be provided for staging or developing domains to a maximum of 3.: 신규 활성화 키는 도메인 시범(staging) 또는 개발을 위해 최고 3개까지 제공될 수 있습니다.\nNo activation key is necessary for `localhost` and `127.0.0.1`.: 로컬호스트와 127.0.0.1에는 활성화 키가 필요하지 않습니다.\nAny other staging domains will require a license (Professional or Business) that allows to generate a new key for those.: Any other staging domains will require a license (Professional or Business) that allows to generate a new key for those.\nYour email address: 귀하의 이메일 주소\nGenerate only 1 activation key. No dev/staging domains possible.: 활성화 키 하나만 생성. No dev/staging domains possible.\nPrice varies depending on the extension: 확장 프로그램에 따라 가격이 달라집니다\nGenerate up to 5 activation keys. Dev/staging domains included.: 활성화 키 최대 5개까지 생성. Dev/staging domains included.\nGenerate a common activation key: 공동 활성화 키 생성\nWithin a product: 제품 내\nMobile applications: 모바일 애플리케이션\n\n#extensions bundle:\nAll extensions bundle: 확장 프로그램 일괄 구매하기\nGet all the extensions starting from $119!: 확장 프로그램 $199 부터~\nIncluding future ones!: 나중에 사용할 프로그램도 지금 미리 구매하세요!\nGet the extensions pack!: 확장 프로그램 패키지 구매하기\n\nlanguage-menu-extensions:\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/\"><span class=\"flag flag-english\"></span>English</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/ru/\"><span class=\"flag flag-russian\"></span>Pусский</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/es/\"><span class=\"flag flag-spanish\"></span>Español</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/zh/\"><span class=\"flag flag-chinese\"></span>中文</a></li>\n"
  },
  {
    "path": "lang/website/ru.yml",
    "content": "#Page meta data\ntitle: fullPage.js | для постраничного скроллинга разделов сайта\ndescription: плагин от Alvaro. Создавайте полноэкранные страницы быстро и просто. Разделы с постраничной прокруткой. По щелчку мыши.\nkeywords: полноэкранный,экран,полный,щёлкнуть,щелчок,прокрутка,разделы\nog-title: Полноэкранная прокрутка по щелчку мыши. Создавайте полноэкранные страницы быстро и просто.\nog-description: Потрясающая библиотека для переходов к разделам и слайдам. Быстро и просто.\ntwitter-description: Отличная библиотека Javascript для создания веб-сайтов с полноэкранной прокруткой.\n\n#Sections content\nCreate Beautiful Fullscreen Scrolling Websites: Cоздавайте красивые сайты с полноэкранной прокруткой\nDownload: Загрузить\nView on GitHub: Посмотреть на GitHub\nOpen: Открытость\njs is actively maintained and community driven: js активно поддерживается сообществом\nSolving developers' issues since 2013: Решаем проблемы разработчиков с 2013\ncommits: commits\nclosed issues: решённые вопросы\ncontributors: contributors\nThe best!: Лучшее!\nCompatible: Совместимость\nEasy!: Простота!\nSee in Codepen: Посмотреть в Codepen\nTouch me!: Прикоснись ко мне!\nDesigned for mobiles and tablets, totally responsive: Разработано для мобильных телефонов и планшетов, быстро реагирует\nBecause not only kids like to grab things: Потому что трогать вещи любят не только дети\n\n#menu\nWordpress Theme: Тема Wordpress\nWordPress: Wordpress\nExamples: Примеры\nPricing: Цены\nDocs: Документация\nContact: Контакты\n\n#sections content\nProud of being the most complete framework of its kind: Гордимся тем, что мы – самая совершенная в своём роде платформа для разработки приложений\nTrusted by the most innovative companies: Нам доверяют самые инновационные компании\nWorking in modern and old browsers too!: Работает и в современных, и в устаревших браузерах!\nMake a beautiful site for all! Not just a few!: Сделайте красивый сайт для всех! А не для нескольких!\njs is designed to be easy to use and customize: js разработан для простого использования и персонализации\nIt includes tens of examples, great documentation and both community and personal support: Включает десятки примеров, прекрасную документацию, персональную поддержку и поддержку сообщества\n\n#sections content\nNavigation: Навигация\nScroll Bar Enabled: Полоса прокрутки активирована\nNormal scrolling: Обычная прокрутка\nContinuous vertical: Continuous vertical\nWithout anchor links (same URL): Без ссылок с привязками (тот же URL)\nVertical navigation dots: Точки для вертикальной навигации\nHorizontal navigation dots: Точки для горизонтальной навигации\nExtensions: Расширения\nCards 3D: Cards 3D\nParallax: Parallax\nContinuous Horizontal: Continuous Horizontal\nInterlocked Slides: Interlocked Slides\nReset Sliders: Reset Sliders\nResponsive Slides: Responsive Slides\nScroll Horizontally: Scroll Horizontally\nFading Effect: Fading Effect\nOffset Sections: Offset Sections\nDrag And Move: Drag And Move\nScrollOverflow Reset: ScrollOverflow Reset\nDesign: Дизайн\nResponsive: Responsive\nFull backgrounds: Полноэкранные фоны\nFull background videos: Полноэкранные видео-фоны\nAuto-height sections: Разделы с автовысотой\nGradient backgrounds: Градиентные фоны\nScrolling inside sections and slides: Прокрутка внутри разделов и слайдов\nAdding fixed header and footer: Добавить фиксированные колонтитулы\nOne single section: Один отдельный раздел\nOther: Другое\nAnimations on scrolling: Анимации при прокрутке\nCallbacks: Обратные вызовы\nFunctions and methods: Функции\n\ndocumentation-link: https://alvarotrigo.com/fullPage/docs/ru/\ndocumentation-link-github: https://github.com/alvarotrigo/fullPage.js/tree/master/lang/russian\nextensions-link: https://alvarotrigo.com/fullPage/extensions/ru/\nlang: ru\nflag-name: flag-russian\nlanguage-name: Pусский\ncanonical-link: https://alvarotrigo.com/fullPage/ru/\nlanguage-menu:\n      <li><a href=\"https://alvarotrigo.com/fullPage/\"><span class=\"flag flag-english\"></span>English</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/ko/\"><span class=\"flag flag-korean\"></span>한국어</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/ja/\"><span class=\"flag flag-japanese\"></span>日本語</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/es/\"><span class=\"flag flag-spanish\"></span>Español</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/zh/\"><span class=\"flag flag-chinese\"></span>中文</a></li>\n\n\n# Extensions page\nNeed some extra feature? Fullpage.js provides extensions that you can use to enhance its already amazing behavior!: Требуются какие-либо дополнительные функции? Fullpage.js предлагает расширения, которые вы можете использовать для совершенствования его и так потрясающих функциональных возможностей!\nParallax Backgrounds: Параллакс-фоны\nCreates a parallax effect for the backgrounds of sections and slides when scrolling and sliding.: Создаёт параллакс-эффект для фонов разделов и слайдов при прокрутке и пролистывании.\nBuy: Купить\nDemo: Демо\n#ScrollOverflow Reset: #ScrollOverflow Reset\nScrolls back the content of the section/slide with scroll bar when leaving it so it will always be at the start.: Осуществляет обратную прокрутку контента раздела/слайда при его покидании с помощью полосы прокрутки, чтобы всегда отображалось начало контента.\n#Drag And Move: #Drag And Move\nAllows to move between sections and slides by clicking and dragging the mouse as well as by swiping with fingers.: Позволяет перемещаться между разделами и слайдами при помощи щелчков и протягиваний мышью или пролистывания пальцев.\n#Offset Sections: #Offset Sections\nProvides a way to use non full screen sections based on percentage. Ideal to show visitors there's more content in the site by showing part of the next or previous section.: Обеспечивает возможность использовать неполноэкранные разделы на основании их процентных значений. Опция идеальна для демонстрации посетителям сайта того, что на сайте есть больше контента, показывая часть следующего или предыдущего раздела.\n#Fading Effect: #Fading Effect\nProvides a fading effect for vertical sections and horizontal slides or for any of them separately.: Осуществляет эффект затухания для вертикальных разделов и горизонтальных слайдов или же отдельно для того и другого.\n#Responsive Slides: #Responsive Slides\nAllows the turn of horizontal slides into vertical sections on responsive or by using external functions.: Позволяет трансформировать горизонтальные слайды в вертикальные разделы в отзывчивом режиме или с помощью внешних функций.\n#Continuous Horizontal: #Continuous Horizontal\nProvides the continuous horizontal scrolling feature for all the sliders.: Осуществляет функцию бесконечной горизонтальной прокрутки для всех ползунков.\n#Interlocked Slides: #Interlocked Slides\nProvides a way to force the moving of sliders in other sections when sliding the visible one.: Даёт возможность передвижения ползунков в других разделах при передвижении видимого ползунка.\n#Scroll Horizontally: #Scroll Horizontally\nProvides horizontal scroll within sliders by using the mouse wheel or trackpad. Ideal for story telling!: Осуществляет горизонтальное передвижение ползунков при помощи колеса мыши или трекпада. Идеальна для рассказов!\n#Reset Sliders: #Reset Sliders\nForces fullpage.js to reset every slider after leaving its section. This way when the users goes back it will always be in the first slide of the slider.: Заставляет fullpage.js возвращать в исходное положение каждый ползунок после покидания раздела, в котором он размещён. Таким образом, при возвращении к разделу пользователь всегда будет видеть первый слайд.\nWhich license should I use?: Какую лицензию мне следует использовать?\nFor up to 1 website: До одного веб-сайта\nHobby: Hobby\n1 domain: 1 домен\nMinified source code: Минифицированный исходный код\nFree updates: Бесплатные обновления\nLicense agreement: Лицензионное соглашение\nFor up to 5 websites: До 5 веб-сайтов\nProfessional: Professional\nBest value!: Лучшее предложение!\n5 domains: 5 доменов\nFor unlimited websites: Для неограниченного количества веб-сайтов\nBusiness: Business\nUnlimited Domains: Неограниченное количество доменов\nCommon activation key: Общий ключ активации\nUse in SaaS product: Использование в SaaS-продуктах\nRefund: Возврат денежных средств\nUpdates: Обновления\nStaging / dev domains: Подготавливаемые/разрабатываемые домены\nTrusted by the world’s most innovative companies: Нам доверяют самые инновационные компании мира\nPeople love fullPage.js!: Люди любят fullPage.js!\nVertical Navigation: Вертикальная навигация\nAdd the stylesheet after fullpage.css and... that's it!: Добавьте стилевое оформление после fullpage.css и…готово!\nAvailable in 2 sizes: Доступно в 2 форматах\nGet all navigation styles from Â£9: Получить все стили навигации от 9 фунтов\n30-Day Money Back Guarrantee: Гарантия возврата денежных средств в течение 30 дней\nSubscribe: Подписаться\nGet notified of new extensions or fullpage.js relevant announcements.: Получать уведомления о новых расширениях или актуальных сообщениях fullpage.js\nActivation Key per Domain: Ключ активации для домена\nOnly if no activation key was generated.: Только если код активации не был создан.\nRead the license refund terms: Читать условия возмещения денежных средств за лицензию\n1 month support: Поддержка в течение 1 месяца\nIsolated reproductions might be required.: Может потребоваться изолированная репликация\nRead the license support terms: Читать условия поддержки лицензий\n6 months support: Поддержка в течение 6 месяцев\nUnlimited support: Неограниченная поддержка\nRedistribute: Перераспределить\nGot questions? Check the: Есть вопросы? Посмотрите\n30-days money back guaranteed for any purchase under the conditions detailed in the License Agreement: Возврат денежных средств в течение 30 дней гарантирован для любой покупки на условиях, описанных в Лицензионном соглашении\nfullPage.js Refund Terms: Условия возмещения денежных средств fullPage.js\nAll licenses include free updates for the purchased license and buyers will be notified by mail of new releases.: Все лицензии включают бесплатные обновления для приобретённой лицензии, и покупатели получают уведомления и новых версиях по электронной почте.\nUpon request: По запросу\nnew activation keys can be provided for staging or developing domains to a maximum of 3.: новые ключи активации могут быть предоставлены максимум для 3 подготавливаемых или разрабатываемых доменов.\nNo activation key is necessary for `localhost` and `127.0.0.1`.: Ключ активации не требуется для локального хоста и 127.0.0.1.\nAny other staging domains will require a license (Professional or Business) that allows to generate a new key for those.: Any other staging domains will require a license (Professional or Business) that allows to generate a new key for those.\nYour email address: Ваш адрес электронной почты\nGenerate only 1 activation key. No dev/staging domains possible.: Создать только 1 ключ активации. No dev/staging domains possible.\nPrice varies depending on the extension: Стоимость зависит от расширения\nGenerate up to 5 activation keys. Dev/staging domains included.: Создать до 5 ключей активации. Dev/staging domains included.\nGenerate a common activation key: Создать общий ключ активации\nWithin a product: Внутри продукта\nMobile applications: мобильные приложения\n\n#extensions bundle:\nAll extensions bundle: All extensions bundle\nGet all the extensions starting from $119!: Get all the extensions starting from $119!\nIncluding future ones!: Including future ones!\nGet the extensions pack!: Get the extensions pack!\n\nlanguage-menu-extensions:\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/\"><span class=\"flag flag-english\"></span>English</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/ko/\"><span class=\"flag flag-korean\"></span>한국어</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/es/\"><span class=\"flag flag-spanish\"></span>Español</a></li>\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/zh/\"><span class=\"flag flag-chinese\"></span>中文</a></li>\n"
  },
  {
    "path": "lang/website/zh.yml",
    "content": "﻿#page meta data - just translate the 2nd part, the part after the semicolon \":\"\r\ntitle: fullPage.js | 单页滚动部分网站插件\r\ndescription: Alvaro的插件。 快速、简单地创建全屏页面。 单页滚动部分。 鼠标捕捉。\r\nkeywords: 全屏，屏幕，全部，快速，捕捉，滚动，部分\r\nog-title: fullPage滚动对齐。 快速简单地创建全屏页面\r\nog-description: 用于捕捉部分和幻灯片的绝佳好库。使用起来快速而简单。\r\ntwitter-description: 伟大的Javascript库，用来创建全屏滚动网站。\r\n\r\n#Sections content\r\nCreate Beautiful Fullscreen Scrolling Websites: 创建美丽的全屏滚动网站\r\nDownload: 下载\r\nView on GitHub: 在GitHub上查看\r\nOpen: 打开\r\njs is actively maintained and community driven: js会经常维护更新，适应大众需求\r\nSolving developers' issues since 2013: 自2013年起解决开发者问题\r\ncommits: 提交\r\nclosed issues: 不公开的问题\r\ncontributors: 贡献者\r\nThe best!: 最好的\r\nCompatible: 兼容\r\nEasy!: 简单\r\nSee in Codepen: 在Codepen中查看\r\nTouch me!: 来吧!\r\nDesigned for mobiles and tablets, totally responsive: 专为手机和平板电脑设计，完全响应\r\nBecause not only kids like to grab things: 不仅仅孩子喜欢抓东西\r\n\r\n#MENU\r\nWordpress Theme: WordPress的主题\r\nWordPress: WordPress\r\nExamples: 例子\r\nPricing: 价钱\r\nDocs: 文档\r\nContact: 联系\r\n\r\n#Sections content\r\nProud of being the most complete framework of its kind: 很荣幸我们的框架是最完整的\r\nTrusted by the most innovative companies: 已获全球最创新企业信赖\r\nWorking in modern and old browsers too!: 兼容现代和旧版浏览器中 \r\nMake a beautiful site for all! Not just a few!: 为所有人打造一个漂亮的网站 而非少数人\r\njs is designed to be easy to use and customize: js易于使用，可自定义\r\nIt includes tens of examples, great documentation and both community and personal support: 包含数十个例子，出色的文档，可社区和个人\r\n\r\n# EXAMPLES\r\nNavigation: 导航\r\nScroll Bar Enabled: 滚动条已启用\r\nNormal scrolling: 正常滚动\r\nContinuous vertical: 垂直连续\r\nWithout anchor links (same URL): 没有锚链接（相同的URL）\r\nVertical navigation dots: 垂直导航点\r\nHorizontal navigation dots: 水平导航点\r\nExtensions: fullpage.js 插件\r\nCards 3D: Cards 3D\r\nParallax: 视差\r\nContinuous Horizontal: 水平连续\r\nInterlocked Slides: 互锁幻灯片\r\nReset Sliders: 重置滑块\r\nResponsive Slides: 响应幻灯片\r\nScroll Horizontally: 水平滚动\r\nFading Effect: 褪去效果\r\nOffset Sections: 偏移部分\r\nDrag And Move: 拖动并移动\r\nScrollOverflow Reset: ScrollOverflow重置\r\nDesign: 设计\r\nResponsive: 响应\r\nFull backgrounds: 全背景\r\nFull background videos: 完整的背景视频\r\nAuto-height sections: 自动高度部分\r\nGradient backgrounds: 渐变背景\r\nScrolling inside sections and slides: 滚动部分和幻灯片\r\nAdding fixed header and footer: 添加固定的页眉和页脚\r\nOne single section: 单一部分\r\nOther: 其他\r\nAnimations on scrolling: 滚动动画\r\nCallbacks: 回调\r\nFunctions and methods: 功能和方法\r\n\r\ndocumentation-link: https://alvarotrigo.com/fullPage/docs/zh/\r\ndocumentation-link-github: https://github.com/alvarotrigo/fullPage.js/tree/master/lang/chinese\r\nextensions-link: https://alvarotrigo.com/fullPage/extensions/zh/\r\nlang: zh-Hans\r\nflag-name: flag-chinese\r\nlanguage-name: 中文\r\ncanonical-link: https://alvarotrigo.com/fullPage/zh/\r\nlanguage-menu:\r\n      <li><a href=\"https://alvarotrigo.com/fullPage/\"><span class=\"flag flag-english\"></span>English</a></li>\r\n      <li><a href=\"https://alvarotrigo.com/fullPage/ko/\"><span class=\"flag flag-korean\"></span>한국어</a></li>\r\n      <li><a href=\"https://alvarotrigo.com/fullPage/ja/\"><span class=\"flag flag-japanese\"></span>日本語</a></li>\r\n      <li><a href=\"https://alvarotrigo.com/fullPage/ru/\"><span class=\"flag flag-russian\"></span>Pусский</a></li>\r\n      <li><a href=\"https://alvarotrigo.com/fullPage/es/\"><span class=\"flag flag-spanish\"></span>Español</a></li>\r\n\r\n\r\n# Extensions website\r\nNeed some extra feature? Fullpage.js provides extensions that you can use to enhance its already amazing behavior!: 需要更多插件或功能？多样的Fullpage.js插件产品为你带来更多令人惊艳的效果和功能\r\nParallax Backgrounds: 视差滚动\r\nCreates a parallax effect for the backgrounds of sections and slides when scrolling and sliding.: 让多层背景（section或 slide）以不同的速度滚动，形成立体的视觉效果。\r\nBuy: 购买插件\r\nDemo: 演示\r\n#ScrollOverflow Reset:\r\nScrolls back the content of the section/slide with scroll bar when leaving it so it will always be at the start.: 滚动时，总是回到section或 slide的开始。\r\n#Drag And Move:\r\nAllows to move between sections and slides by clicking and dragging the mouse as well as by swiping with fingers.: 点击拖拽或手指滑动来切换section或 slide。\r\n#Offset Sections:\r\nProvides a way to use non full screen sections based on percentage. Ideal to show visitors there's more content in the site by showing part of the next or previous section.: 自定义网页的各部分比例，实现非全页的偏移效果。适合网页展示\"下拉查看更多\"的效果。\r\n#Fading Effect:\r\nProvides a fading effect for vertical sections and horizontal slides or for any of them separately.: 实现垂直或水平滚动网页时的渐隐淡出特效，也可实现垂直和水平同时淡出。\r\n#Responsive Slides:\r\nAllows the turn of horizontal slides into vertical sections on responsive or by using external functions.: 响应式调整水平页面和垂直页面大小，带来自适应屏幕大小的效果。\r\n#Continuous Horizontal:\r\nProvides the continuous horizontal scrolling feature for all the sliders.: 实现所有页面持续水平滚动的效果。\r\n#Interlocked Slides:\r\nProvides a way to force the moving of sliders in other sections when sliding the visible one.: 实现子切换当前页面时，移动其他section的 滚动条。\r\n#Scroll Horizontally:\r\nProvides horizontal scroll within sliders by using the mouse wheel or trackpad. Ideal for story telling!: 实现利用鼠标滚轮或触控板水平滚动。最适合讲故事。\r\n#Reset Sliders:\r\nForces fullpage.js to reset every slider after leaving its section. This way when the users goes back it will always be in the first slide of the slider.: 实现每个section的slider·重设效果。当滚动到另一section，自动重设为第一页slide。\r\nWhich license should I use?: 我应该使用哪一个计划？\r\nFor up to 1 website: 1个网页\r\nHobby: Hobby\r\n1 domain: 1个域名\r\nMinified source code: 精简的源代码\r\nFree updates: 免费更新\r\nLicense agreement: 授权协议\r\nFor up to 5 websites: 5个网页以下\r\nProfessional: Professional\r\nBest value!: 性价比最高！\r\n5 domains: 5 个域名\r\nFor unlimited websites: 无限个网页\r\nBusiness: Business\r\nUnlimited Domains: 无限域名\r\nCommon activation key: 共同激活码\r\nUse in SaaS product: 用于软件服务\r\nRefund: 退款\r\nUpdates: 更新\r\nStaging / dev domains: 测试域名\r\nTrusted by the world’s most innovative companies: 已获全球最创新企业信赖：\r\nPeople love fullPage.js!: 大家都喜爱fullPage.js 插件！\r\nVertical Navigation: 垂直导航\r\nAdd the stylesheet after fullpage.css and... that's it!: 在fullpage.css之后，添加样式表...大功告成！\r\nAvailable in 2 sizes: 2种大小\r\nGet all navigation styles from Â£9: 所有导航效果只需Â£9起\r\n30-Day Money Back Guarrantee: 30天退款保证\r\nSubscribe: 订阅\r\nGet notified of new extensions or fullpage.js relevant announcements.: 了解更多关于fullpage.js或新的插件产品。\r\nActivation Key per Domain: 每个域名包含各自激活码\r\nOnly if no activation key was generated.: 只有当激活码未被使用\r\nRead the license refund terms: 阅读授权退款政策\r\n1 month support: 1个月授权\r\nIsolated reproductions might be required.: 您可能会被要求提供独立的复件\r\nRead the license support terms: 阅读授权许可协议\r\n6 months support: 6个月授权\r\nUnlimited support: 无限时间授权\r\nRedistribute: 二次授权\r\nGot questions? Check the: 有疑问吗？请点击\r\n30-days money back guaranteed for any purchase under the conditions detailed in the License Agreement: 任何符合授权退款政策条例的购买适用30天退款保证\r\nfullPage.js Refund Terms: fullPage.js阅读授权退款政策\r\nAll licenses include free updates for the purchased license and buyers will be notified by mail of new releases.: 所有计划包含免费更新，您将通过邮件收到最新信息。\r\nUpon request: 收到申请\r\nnew activation keys can be provided for staging or developing domains to a maximum of 3.: 可为测试域名提供至多3个新的激活码\r\nNo activation key is necessary for `localhost` and `127.0.0.1`.: 本地存储的主机和127.0.0.1.无需激活码\r\nAny other staging domains will require a license (Professional or Business) that allows to generate a new key for those.: Any other staging domains will require a license (Professional or Business) that allows to generate a new key for those.\r\nYour email address: 你的邮箱地址\r\nGenerate only 1 activation key. No dev/staging domains possible.: 只生成1个激活码. No dev/staging domains possible.\r\nPrice varies depending on the extension: 选择不同的Fullpage.js插件，价格不同\r\nGenerate up to 5 activation keys. Dev/staging domains included.: 生成5个激活码. Dev/staging domains included.\r\nGenerate a common activation key: 生成1个共同激活码\r\nWithin a product: 一个产品内\r\nMobile applications: 手机软件\r\n\r\n#extensions bundle:\r\nAll extensions bundle: All extensions bundle\r\nGet all the extensions starting from $119!: Get all the extensions starting from $119!\r\nIncluding future ones!: Including future ones!\r\nGet the extensions pack!: Get the extensions pack!\r\n\r\nlanguage-menu-extensions:\r\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/\"><span class=\"flag flag-english\"></span>English</a></li>\r\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/ru/\"><span class=\"flag flag-russian\"></span>Pусский</a></li>\r\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/ko/\"><span class=\"flag flag-korean\"></span>한국어</a></li>\r\n      <li><a href=\"https://alvarotrigo.com/fullPage/extensions/es/\"><span class=\"flag flag-spanish\"></span>Español</a></li>\r\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"fullpage.js\",\n  \"version\": \"4.0.41\",\n  \"description\": \"Create beautiful fullscreen snap scrolling websites\",\n  \"main\": \"dist/fullpage.js\",\n  \"types\": \"types/index.d.ts\",\n  \"scripts\": {\n    \"build\": \"gulp getDistFiles && gulp update-version && gulp css && rollup -c\",\n    \"extensions\": \"rollup --config rollup.ext.config.js && gulp update-version &&  gulp css && gulp moveExtensions && gulp moveExtensionsSRC && wait\",\n    \"limited\": \"rollup --config rollup.limited.config.js && gulp update-version &&  gulp css-lite && gulp moveLite && wait\",\n    \"dev\": \"rollup -c --watch\",\n    \"test\": \"jest\",\n    \"devtest\": \"jest --watch\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git@github.com:alvarotrigo/fullPage.js.git\"\n  },\n  \"keywords\": [\n    \"jquery\",\n    \"javacript\",\n    \"scrolling\",\n    \"single_page\",\n    \"onepage\",\n    \"fullpage\",\n    \"fullpagejs\",\n    \"one_page\",\n    \"sliding\",\n    \"snap\",\n    \"scroll\",\n    \"swipe\",\n    \"mousewheel\",\n    \"wheel\",\n    \"mouse\",\n    \"sections\",\n    \"slides\",\n    \"slideshow\"\n  ],\n  \"files\": [\n    \"vendors\",\n    \"dist/fullpage.css\",\n    \"dist/fullpage.min.css\",\n    \"dist/fullpage.min.css.map\",\n    \"dist/fullpage.extensions.min.js\",\n    \"dist/fullpage.min.js\",\n    \"dist/fullpage.js\",\n    \"LICENSE\",\n    \"package.json\",\n    \"README.md\"\n  ],\n  \"authors\": [\n    \"Alvaro Trigo https://github.com/alvarotrigo\"\n  ],\n  \"license\": \"GPL-3.0\",\n  \"bugs\": {\n    \"url\": \"https://github.com/alvarotrigo/fullPage.js/issues\"\n  },\n  \"homepage\": \"https://alvarotrigo.com/fullPage/\",\n  \"funding\": [\n    {\n      \"type\": \"GitHub Sponsors\",\n      \"url\": \"https://github.com/sponsors/alvarotrigo\"\n    }\n  ],\n  \"namespace\": \"fullpage_api\",\n  \"devDependencies\": {\n    \"@babel/preset-env\": \"^7.16.11\",\n    \"@rollup/plugin-babel\": \"^5.3.0\",\n    \"@rollup/plugin-commonjs\": \"^21.0.1\",\n    \"@rollup/plugin-node-resolve\": \"^13.0.6\",\n    \"@rollup/stream\": \"^2.0.0\",\n    \"babel-cli\": \"^6.26.0\",\n    \"babel-plugin-external-helpers\": \"^6.22.0\",\n    \"babel-preset-latest\": \"^6.24.1\",\n    \"gulp\": \"^4.0.0\",\n    \"gulp-clean-css\": \"^4.0.0\",\n    \"gulp-rename\": \"^1.2.2\",\n    \"gulp-replace\": \"^1.0.0\",\n    \"gulp-sourcemaps\": \"^2.6.4\",\n    \"gulp-terser\": \"^2.1.0\",\n    \"gulp-uglify\": \"^3.0.0\",\n    \"require-dir\": \"^1.2.0\",\n    \"rollup-plugin-terser\": \"^7.0.2\",\n    \"vinyl-buffer\": \"^1.0.1\",\n    \"vinyl-source-stream\": \"^2.0.0\"\n  }\n}\n"
  },
  {
    "path": "rollup.config.js",
    "content": "import { terser } from \"rollup-plugin-terser\";\nimport resolve from \"@rollup/plugin-node-resolve\";\nimport babel from \"@rollup/plugin-babel\";\n\nconst licenseContent = `/*!\n* fullPage 4.0.41\n* https://github.com/alvarotrigo/fullPage.js\n*\n* @license GPLv3 for open source use only\n* or Fullpage Commercial License for commercial use\n* http://alvarotrigo.com/fullPage/pricing/\n*\n* Copyright (C) 2018 http://alvarotrigo.com/fullPage - A project by Alvaro Trigo\n*/\n`;\n\nconst terserOptions = {\n    compress: {\n        passes: 2,\n        drop_console: true,\n    },\n    mangle: {\n        properties: {\n            // regex: /_$/,\n            keep_quoted: true,\n            reserved: [\n                'fullpage',\n                'jQuery',\n                '$',\n                'fn',\n                \n                // options\n                'menu',\n                'anchors',\n                'lockAnchors',\n                'navigation',\n                'navigationPosition',\n                'navigationTooltips',\n                'showActiveTooltip',\n                'slidesNavigation',\n                'slidesNavPosition',\n                'scrollBar',\n                'hybrid',\n                'licenseKey',\n                'credits',\n                'css3',\n                'scrollingSpeed',\n                'autoScrolling',\n                'fitToSection',\n                'fitToSectionDelay',\n                'easing',\n                'easingcss3',\n                'loopBottom',\n                'loopTop',\n                'loopHorizontal',\n                'continuousVertical',\n                'continuousHorizontal',\n                'scrollHorizontally',\n                'interlockedSlides',\n                'dragAndMove',\n                'offsetSections',\n                'resetSliders',\n                'fadingEffect',\n                'normalScrollElements',\n                'scrollOverflow',\n                'scrollOverflowReset',\n                'touchSensitivity',\n                'skipIntermediateItems',\n                'touchWrapper',\n                'bigSectionsDestination',\n                'adjustOnNavChange',\n                'keyboardScrolling',\n                'animateAnchor',\n                'recordHistory',\n                'allowCorrectDirection',\n                'scrollOverflowMacStyle',\n                'controlArrows',\n                'controlArrowsHTML',\n                'controlArrowColor',\n                'verticalCentered',\n                'sectionsColor',\n                'paddingTop',\n                'paddingBottom',\n                'fixedElements',\n                'responsive',\n                'responsiveWidth',\n                'responsiveHeight',\n                'responsiveSlides',\n                'effects',\n                'effectsOptions',\n                'cinematic',\n                'cinematicOptions',\n                'parallax',\n                'parallaxOptions',\n                'type',\n                'percentage',\n                'property',\n                'cards',\n                'cardsOptions',\n                'perspective',\n                'fadeContent',\n                'fadeBackground',\n                'sectionSelector',\n                'slideSelector',\n                'rtl',\n\n                // Callbacks\n                'afterLoad',\n                'beforeLeave',\n                'onLeave',\n                'afterRender',\n                'afterResize',\n                'afterReBuild',\n                'afterSlideLoad',\n                'onSlideLeave',\n                'afterResponsive',\n                'onScrollOverflow',\n\n                'lazyLoading',\n                'lazyLoadThreshold',\n                'observer',\n                'scrollBeyondFullpage',\n\n                // Public API\n                'version',\n                'setAutoScrolling',\n                'setRecordHistory',\n                'setScrollingSpeed',\n                'setFitToSection',\n                'setLockAnchors',\n                'setMouseWheelScrolling',\n                'setAllowScrolling',\n                'setKeyboardScrolling',\n                'moveSectionUp',\n                'moveSectionDown',\n                'silentMoveTo',\n                'moveTo',\n                'moveSlideRight',\n                'moveSlideLeft',\n                'reBuild',\n                'setResponsive',\n                'getFullpageData',\n                'destroy',\n                'getActiveSection',\n                'getActiveSlide',\n                'getScrollY',\n                'getScrollX',\n                'landscapeScroll',\n                'test',\n                'shared',\n                'internals',\n                'fullpage_api',\n                'fullpage_extensions',\n                'fp_easings',\n                'easeInOutCubic',\n\n                //fp_utils scrollOverflow\n                'isScrolled',\n\n                // Callbacks params\n                'anchor',\n                'index',\n                'item',\n                'isFirst',\n                'isLast',\n\n                // directions\n                'up',\n                'down',\n                'left',\n                'right',\n                'all',\n                'k',\n                'm'\n\n            ]\n        }\n    }\n   \n};\n\n// ([a-zA-Z0-9]+\\.)+(\\w+)\n// https://jsfiddle.net/kut3oh5j/\nmodule.exports = [\n    {\n        input: \"src/js/app.js\",\n        external: [\n            'fullpage',\n            'fullpage_api',\n            'window',\n            'document'\n        ],\n        globals: {\n            'document': 'document',\n            'window': 'window'\n        },\n      \n        output: [\n            {\n                file: \"dist/fullpage.js\",\n                name: \"fullpage\",\n                format: \"umd\",\n                banner: licenseContent,\n                globals: {\n                    'document': 'document',\n                    'window': 'window'\n                },\n            },\n            {\n                file: \"dist/fullpage.min.js\",\n                name: \"fullpage\",\n                format: \"umd\",\n                banner: licenseContent,\n                plugins: [terser(terserOptions)],\n                globals: {\n                    'document': 'document',\n                    'window': 'window'\n                },\n            },\n           \n        ],\n        plugins: [\n            resolve(),\n            babel({\n                presets: [\n                    [\n                        '@babel/preset-env',\n                        {\n                            targets: {\n                                \"ie\": \"11\"\n                            }\n                        }\n                    ]\n                    \n                ],\n                babelHelpers: \"bundled\",\n                exclude: \"node_modules/**\"\n            })\n        ]\n    }\n];\n\n\n"
  },
  {
    "path": "src/css/fullpage.css",
    "content": "/*!\r\n * fullPage 4.0.41\r\n * https://github.com/alvarotrigo/fullPage.js\r\n *\r\n * @license GPLv3 for open source use only\r\n * or Fullpage Commercial License for commercial use\r\n * http://alvarotrigo.com/fullPage/pricing/\r\n *\r\n * Copyright (C) 2021 http://alvarotrigo.com/fullPage - A project by Alvaro Trigo\r\n */\r\nhtml.fp-enabled,\r\n.fp-enabled body {\r\n    margin: 0;\r\n    padding: 0;\r\n    overflow:hidden;\r\n\r\n    /*Avoid flicker on slides transitions for mobile phones #336 */\r\n    -webkit-tap-highlight-color: rgba(0,0,0,0);\r\n}\r\n.fp-section {\r\n    position: relative;\r\n    -webkit-box-sizing: border-box; /* Safari<=5 Android<=3 */\r\n    -moz-box-sizing: border-box; /* <=28 */\r\n    box-sizing: border-box;\r\n    height: 100%;\r\n    display: block;\r\n}\r\n.fp-slide {\r\n    float: left;\r\n}\r\n.fp-slide, .fp-slidesContainer {\r\n    height: 100%;\r\n    display: block;\r\n}\r\n.fp-slides {\r\n    z-index:1;\r\n    height: 100%;\r\n    overflow: hidden;\r\n    position: relative;\r\n    -webkit-transition: all 0.3s ease-out; /* Safari<=6 Android<=4.3 */\r\n    transition: all 0.3s ease-out;\r\n}\r\n.fp-table{\r\n    display: flex;\r\n    flex-direction: column;\r\n    justify-content: center;\r\n    width: 100%;\r\n}\r\n.fp-slidesContainer {\r\n    float: left;\r\n    position: relative;\r\n}\r\n.fp-controlArrow {\r\n    -webkit-user-select: none; /* webkit (safari, chrome) browsers */\r\n    -moz-user-select: none; /* mozilla browsers */\r\n    -khtml-user-select: none; /* webkit (konqueror) browsers */\r\n    -ms-user-select: none; /* IE10+ */\r\n    position: absolute;\r\n    z-index: 4;\r\n    top: 50%;\r\n    cursor: pointer;\r\n    margin-top: -38px;\r\n    -webkit-transform: translate3d(0,0,0);\r\n    -ms-transform: translate3d(0,0,0);\r\n    transform: translate3d(0,0,0);\r\n}\r\n.fp-prev{\r\n    left: 15px;\r\n}\r\n.fp-next{\r\n    right: 15px;\r\n}\r\n.fp-arrow{\r\n    width: 0;\r\n    height: 0;\r\n    border-style: solid;\r\n}\r\n.fp-arrow.fp-prev {\r\n    border-width: 38.5px 34px 38.5px 0;\r\n    border-color: transparent #fff transparent transparent;\r\n}\r\n.fp-arrow.fp-next {\r\n    border-width: 38.5px 0 38.5px 34px;\r\n    border-color: transparent transparent transparent #fff;\r\n}\r\n.fp-notransition {\r\n    -webkit-transition: none !important;\r\n    transition: none !important;\r\n}\r\n#fp-nav {\r\n    position: fixed;\r\n    z-index: 100;\r\n    top: 50%;\r\n    opacity: 1;\r\n    transform: translateY(-50%);\r\n    -ms-transform: translateY(-50%);\r\n    -webkit-transform: translate3d(0,-50%,0);\r\n    pointer-events: none;\r\n}\r\n#fp-nav.fp-right {\r\n    right: 17px;\r\n}\r\n#fp-nav.fp-left {\r\n    left: 17px;\r\n}\r\n.fp-slidesNav{\r\n    position: absolute;\r\n    z-index: 4;\r\n    opacity: 1;\r\n    -webkit-transform: translate3d(0,0,0);\r\n    -ms-transform: translate3d(0,0,0);\r\n    transform: translate3d(0,0,0);\r\n    left: 0 !important;\r\n    right: 0;\r\n    margin: 0 auto !important;\r\n    pointer-events: none;\r\n}\r\n.fp-slidesNav.fp-bottom {\r\n    bottom: 17px;\r\n}\r\n.fp-slidesNav.fp-top {\r\n    top: 17px;\r\n}\r\n#fp-nav ul,\r\n.fp-slidesNav ul {\r\n  margin: 0;\r\n  padding: 0;\r\n}\r\n#fp-nav ul li,\r\n.fp-slidesNav ul li {\r\n    display: block;\r\n    width: 14px;\r\n    height: 13px;\r\n    margin: 7px;\r\n    position:relative;\r\n}\r\n.fp-slidesNav ul li {\r\n    display: inline-block;\r\n}\r\n#fp-nav ul li a,\r\n.fp-slidesNav ul li a {\r\n    display: block;\r\n    position: relative;\r\n    z-index: 1;\r\n    width: 100%;\r\n    height: 100%;\r\n    cursor: pointer;\r\n    text-decoration: none;\r\n    pointer-events: all;\r\n}\r\n#fp-nav ul li a.active span,\r\n.fp-slidesNav ul li a.active span,\r\n#fp-nav ul li:hover a.active span,\r\n.fp-slidesNav ul li:hover a.active span{\r\n    height: 12px;\r\n    width: 12px;\r\n    margin: -6px 0 0 -6px;\r\n    border-radius: 100%;\r\n }\r\n#fp-nav ul li a span,\r\n.fp-slidesNav ul li a span {\r\n    border-radius: 50%;\r\n    position: absolute;\r\n    z-index: 1;\r\n    height: 4px;\r\n    width: 4px;\r\n    border: 0;\r\n    background: #333;\r\n    left: 50%;\r\n    top: 50%;\r\n    margin: -2px 0 0 -2px;\r\n    -webkit-transition: all 0.1s ease-in-out;\r\n    -moz-transition: all 0.1s ease-in-out;\r\n    -o-transition: all 0.1s ease-in-out;\r\n    transition: all 0.1s ease-in-out;\r\n}\r\n#fp-nav ul li:hover a span,\r\n.fp-slidesNav ul li:hover a span{\r\n    width: 10px;\r\n    height: 10px;\r\n    margin: -5px 0px 0px -5px;\r\n}\r\n#fp-nav ul li .fp-tooltip {\r\n    position: absolute;\r\n    top: -2px;\r\n    color: #fff;\r\n    font-size: 14px;\r\n    font-family: arial, helvetica, sans-serif;\r\n    white-space: nowrap;\r\n    max-width: 220px;\r\n    overflow: hidden;\r\n    display: block;\r\n    opacity: 0;\r\n    width: 0;\r\n    cursor: pointer;\r\n}\r\n#fp-nav ul li:hover .fp-tooltip,\r\n#fp-nav.fp-show-active a.active + .fp-tooltip {\r\n    -webkit-transition: opacity 0.2s ease-in;\r\n    transition: opacity 0.2s ease-in;\r\n    width: auto;\r\n    opacity: 1;\r\n}\r\n#fp-nav ul li .fp-tooltip.fp-right {\r\n    right: 20px;\r\n}\r\n#fp-nav ul li .fp-tooltip.fp-left {\r\n    left: 20px;\r\n}\r\n.fp-auto-height.fp-section,\r\n.fp-auto-height .fp-slide{\r\n    height: auto !important;\r\n}\r\n\r\n.fp-responsive .fp-is-overflow.fp-section{\r\n    height: auto !important;\r\n}\r\n\r\n/* Tries to prevent overwrites #4657 */\r\n.fp-enabled .fp-scrollable{\r\n    overflow: visible;\r\n    height: initial;\r\n}\r\n\r\n/* Used with autoScrolling: false */ \r\n.fp-scrollable.fp-responsive .fp-is-overflow.fp-section,\r\n.fp-scrollable .fp-section,\r\n.fp-scrollable .fp-slide{\r\n   /* Fallback for browsers that do not support Custom Properties */\r\n   height: 100vh;\r\n   height: calc(var(--vh, 1vh) * 100);\r\n}\r\n\r\n.fp-scrollable.fp-responsive .fp-is-overflow.fp-section:not(.fp-auto-height):not([data-percentage]),\r\n.fp-scrollable .fp-section:not(.fp-auto-height):not([data-percentage]),\r\n.fp-scrollable .fp-slide:not(.fp-auto-height):not([data-percentage]){\r\n    /* Fallback for browsers that do not support Custom Properties */\r\n    min-height: 100vh;\r\n    min-height: calc(var(--vh, 1vh) * 100);\r\n}\r\n\r\n/* Disabling vertical centering on scrollable elements */\r\n.fp-overflow{\r\n    justify-content: flex-start;\r\n    width: 100%; /* In case its necessary #4717 */\r\n}\r\n\r\nbody:not(.fp-responsive) .fp-overflow{\r\n    max-height: 100vh;\r\n    max-height: 100dvh; /* fix for new browsers */\r\n}\r\n\r\n/* No scrollable when using auto-height */\r\n.fp-scrollable .fp-auto-height .fp-overflow{\r\n    max-height: none;\r\n}\r\n\r\n.fp-is-overflow .fp-overflow.fp-auto-height-responsive,\r\n.fp-is-overflow .fp-overflow.fp-auto-height,\r\n.fp-is-overflow .fp-overflow{\r\n    overflow-y: auto;\r\n}\r\n.fp-overflow{\r\n    outline:none;\r\n}\r\n\r\n.fp-overflow.fp-table{\r\n    display: block;\r\n}\r\n\r\n.fp-responsive .fp-auto-height-responsive.fp-section,\r\n.fp-responsive .fp-auto-height-responsive .fp-slide,\r\n.fp-responsive .fp-auto-height-responsive .fp-overflow{\r\n    height: auto !important;\r\n    min-height: auto !important;\r\n}\r\n\r\n/*Only display content to screen readers*/\r\n.fp-sr-only{\r\n    position: absolute;\r\n    width: 1px;\r\n    height: 1px;\r\n    padding: 0;\r\n    overflow: hidden;\r\n    clip: rect(0, 0, 0, 0);\r\n    white-space: nowrap;\r\n    border: 0;\r\n}\r\n\r\n/* Customize website's scrollbar like Mac OS\r\nNot supports in Firefox and IE */\r\n.fp-scroll-mac .fp-overflow::-webkit-scrollbar {\r\n    background-color: transparent;\r\n    width: 9px;\r\n}\r\n.fp-scroll-mac .fp-overflow::-webkit-scrollbar-track {\r\n    background-color: transparent;\r\n}\r\n.fp-scroll-mac .fp-overflow::-webkit-scrollbar-thumb {\r\n    background-color: rgba(0,0,0,.4);\r\n    border-radius: 16px;\r\n    border: 4px solid transparent;\r\n}\r\n.fp-warning,\r\n.fp-watermark{\r\n    z-index: 9999999;\r\n    position: absolute;\r\n    bottom: 0;\r\n}\r\n.fp-warning,\r\n.fp-watermark a{\r\n    text-decoration: none;\r\n    color: #000;\r\n    background: rgba(255,255,255,0.6);\r\n    padding: 5px 8px;\r\n    font-size: 14px;\r\n    font-family: arial;\r\n    color: black;\r\n    display: inline-block;\r\n    border-radius: 3px;\r\n    margin: 12px;\r\n}\r\n.fp-noscroll .fp-overflow{\r\n    overflow: hidden;\r\n}"
  },
  {
    "path": "src/js/anchors/getAnchorsURL.js",
    "content": "import { win } from \"../common/constants.js\";\n\n//gets the URL anchors (section and slide)\nexport function getAnchorsURL(){\n    var section;\n    var slide;\n    var hash = win.location.hash;\n\n    if(hash.length){\n        //getting the anchor link in the URL and deleting the `#`\n        var anchorsParts =  hash.replace('#', '').split('/');\n\n        //using / for visual reasons and not as a section/slide separator #2803\n        var isFunkyAnchor = hash.indexOf('#/') > -1;\n\n        section = isFunkyAnchor ? '/' + anchorsParts[1] : decodeURIComponent(anchorsParts[0]);\n\n        var slideAnchor = isFunkyAnchor ? anchorsParts[2] : anchorsParts[1];\n        if(slideAnchor && slideAnchor.length){\n            slide = decodeURIComponent(slideAnchor);\n        }\n    }\n\n    return {\n        section: section,\n        slide: slide\n    };\n}"
  },
  {
    "path": "src/js/anchors/index.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions, getContainer } from '../common/options.js';\nimport { state } from '../common/state.js';\nimport { FP } from '../common/constants.js';\nimport { getAnchorsURL } from '../anchors/getAnchorsURL.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { events } from '../common/events.js';\nimport { OVERFLOW_SEL } from '../common/selectors.js';\nimport { getPanelByElement } from '../common/item.js';\nimport { moveTo } from '../scroll/moveTo.js';\n\nFP.setLockAnchors = setLockAnchors;\nEventEmitter.on(events.bindEvents, bindEvents);\n\nfunction bindEvents(){\n    //detecting any change on the URL to scroll to the given anchor link\n    //(a way to detect back history button as we play with the hashes on the URL)\n    utils.windowAddEvent('hashchange', hashChangeHandler);\n    \n    // Handle clicks on anchor links that point to elements within sections/slides\n    utils.docAddEvent('click', anchorLinkClickHandler);\n    \n    EventEmitter.on(events.onDestroy, onDestroy);\n}\n\n\nfunction onDestroy(){\n    utils.windowRemoveEvent('hashchange', hashChangeHandler);\n    utils.docRemoveEvent('click', anchorLinkClickHandler);\n}\n\n/**\n* Sets lockAnchors\n*/\nfunction setLockAnchors(value){\n    getOptions().lockAnchors = value;\n}\n\n/**\n* Detecting any change on the URL to scroll to the given anchor link\n* (a way to detect back history button as we play with the hashes on the URL)\n*/\nfunction hashChangeHandler(){\n    if(!state.isScrolling && !getOptions().lockAnchors){\n        var anchors = getAnchorsURL();\n        var sectionAnchor = anchors.section;\n        var slideAnchor = anchors.slide;\n\n        //when moving to a slide in the first section for the first time (first time to add an anchor to the URL)\n        var isFirstSlideMove = typeof state.lastScrolledDestiny === 'undefined';\n        var isFirstScrollMove = (typeof state.lastScrolledDestiny === 'undefined' && typeof slideAnchor === 'undefined' && !state.slideMoving);\n\n        if(sectionAnchor && sectionAnchor.length){\n            /*in order to call scrollpage() only once for each destination at a time\n            It is called twice for each scroll otherwise, as in case of using anchorlinks `hashChange`\n            event is fired on every scroll too.*/\n            if ((sectionAnchor && sectionAnchor !== state.lastScrolledDestiny) && !isFirstSlideMove || \n                isFirstScrollMove || \n                (!state.slideMoving && state.lastScrolledSlide != slideAnchor )){\n                    EventEmitter.emit(events.onScrollPageAndSlide, {\n                        sectionAnchor: sectionAnchor,\n                        slideAnchor: slideAnchor\n                    });\n            }\n        }\n    }\n}\n\n/**\n* Handles clicks on anchor links (a[href^=\"#\"]) that point to elements within \n* sections/slides.\n* This allows navigation to specific elements within sections/slides.\n*/\nfunction anchorLinkClickHandler(e){\n    var target = e.target;\n    \n    // Check if the clicked element is an anchor link or is inside one\n    var link = utils.closest(target, 'a[href^=\"#\"]');\n    if(!link) return;\n    \n    var href = utils.getAttr(link, 'href');\n    if(!href || href === '#') return;\n    \n    // Get the target element from the href\n    var targetElement = utils.$(href)[0];\n    if(!targetElement) return;\n    \n    // Only handle links within the fullPage container\n    var container = getContainer();\n    if(!container || !container.contains(targetElement)){\n        return;\n    }\n    \n    var sectionEl = utils.closest(targetElement, getOptions().sectionSelector);\n    if(!sectionEl){\n        return;\n    }\n\n    var section = getPanelByElement(state.sections, sectionEl);\n    if(!section){\n        return;\n    }\n    \n    var slideEl = utils.closest(targetElement, getOptions().slideSelector);\n    var slide = slideEl && sectionEl.contains(slideEl) ? getPanelByElement(section.slides, slideEl) : null;\n    \n    // Prevent default browser scroll behavior\n    utils.preventDefault(e);\n    \n    moveTo(section.index() + 1, slide ? slide.index() : null);\n    \n    var scrollable = utils.$(OVERFLOW_SEL, slide ? slide.item : section.item)[0];\n    if(scrollable){\n        scrollable.scrollTo(0, targetElement.offsetTop);\n    }\n}"
  },
  {
    "path": "src/js/anchors/setPageStatus.js",
    "content": "import { win } from \"../common/constants.js\";\nimport { getOptions } from \"../common/options.js\";\nimport { setState } from \"../common/state.js\";\nimport { setBodyClass } from \"../stateClasses.js\";\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { events } from '../common/events.js';\n\nEventEmitter.on(events.onDestroyAll, onDestroyAll);\n\nfunction onDestroyAll(){\n    // removing hash + # symbol from the URL\n    win.history.replaceState(null, '', win.location.pathname + window.location.search);\n}\n\n/**\n* Sets the state of the website depending on the active section/slide.\n* It changes the URL hash when needed and updates the body class.\n*/\nexport function setPageStatus(slideIndex, slideAnchor, anchorLink){\n    var sectionHash = '';\n\n    if(getOptions().anchors.length && !getOptions().lockAnchors){\n\n        //isn't it the first slide?\n        if(slideIndex){\n            if(anchorLink != null){\n                sectionHash = anchorLink;\n            }\n\n            //slide without anchor link? We take the index instead.\n            if(slideAnchor == null){\n                slideAnchor = slideIndex;\n            }\n\n            setState({lastScrolledSlide: slideAnchor});\n            setUrlHash(sectionHash + '/' + slideAnchor);\n\n        //first slide won't have slide anchor, just the section one\n        }else if(slideIndex != null){\n            setState({lastScrolledSlide: slideAnchor});\n            setUrlHash(anchorLink);\n        }\n\n        //section without slides\n        else{\n            setUrlHash(anchorLink);\n        }\n    }\n\n    setBodyClass();\n}\n\n\n\n/**\n* Sets the URL hash.\n*/\nfunction setUrlHash(url){\n    if(getOptions().recordHistory){\n        location.hash = url;\n    }\n    else{\n        win.history.replaceState(undefined, undefined, '#' + url);\n    }\n}"
  },
  {
    "path": "src/js/anchors/setRecordHistory.js",
    "content": "import { setVariableState } from \"../common/options.js\";\nimport { FP } from '../common/constants.js';\n\nFP.setRecordHistory = setRecordHistory;\n\n/**\n* Defines wheter to record the history for each hash change in the URL.\n*/\nexport function setRecordHistory(value, type){\n    setVariableState('recordHistory', value, type);\n}\n"
  },
  {
    "path": "src/js/app.js",
    "content": "import './polyfills/index.js';\nexport { default } from './fullpage.js';\nimport './easing.js';\nimport './jquery-adaptor.js';"
  },
  {
    "path": "src/js/arrows.js",
    "content": "import * as utils from './common/utils.js';\nimport { getOptions } from './common/options.js'; \nimport { \n    SLIDES_WRAPPER_SEL,\n    SLIDES_ARROW,\n    SLIDES_PREV,\n    SLIDES_NEXT,\n    SLIDES_ARROW_NEXT_SEL,\n    SLIDES_ARROW_PREV_SEL,\n    SLIDES_ARROW_SEL,\n    SECTION_SEL,\n    SLIDES_PREV_SEL, \n } from './common/selectors.js';\nimport { getIsScrollAllowed } from './common/isScrollAllowed.js';\nimport { setState } from './common/state.js';\nimport { EventEmitter } from './common/eventEmitter.js';\nimport { events } from './common/events.js';\n\nEventEmitter.on(events.onClickOrTouch, onClickOrTouch);\n\nfunction onClickOrTouch(params){\n    var target = params.target;\n    if(utils.matches(target, SLIDES_ARROW_SEL) || utils.closest(target, SLIDES_ARROW_SEL)){\n        slideArrowHandler.call(target, params);\n    }\n}\n\n\n//Scrolling horizontally when clicking on the slider controls.\nfunction slideArrowHandler(){\n    /*jshint validthis:true */\n    var section = utils.closest(this, SECTION_SEL);\n    var isPrevArrow = utils.hasClass(this, SLIDES_PREV) || utils.closest(this, SLIDES_PREV_SEL);\n\n    /*jshint validthis:true */\n    if (isPrevArrow) {\n        if(getIsScrollAllowed().m.left){\n            setState({scrollTrigger: 'slideArrow'});\n            EventEmitter.emit(events.moveSlideLeft, {section: section});\n        }\n    } else {\n        if(getIsScrollAllowed().m.right){\n            setState({scrollTrigger: 'slideArrow'});\n            EventEmitter.emit(events.moveSlideRight, {section: section});\n        }\n    }\n}\n\n/**\n* Creates the control arrows for the given section\n*/\nexport function createSlideArrows(section){\n    var sectionElem = section.item;\n    var arrows = [utils.createElementFromHTML(getOptions().controlArrowsHTML[0]), utils.createElementFromHTML(getOptions().controlArrowsHTML[1])];\n    utils.after(utils.$(SLIDES_WRAPPER_SEL, sectionElem)[0], arrows);\n    utils.addClass(arrows, SLIDES_ARROW);\n    utils.addClass(arrows[0], SLIDES_PREV);\n    utils.addClass(arrows[1], SLIDES_NEXT);\n\n    if(getOptions().controlArrowColor !== '#fff'){\n        utils.css(utils.$(SLIDES_ARROW_NEXT_SEL, sectionElem), {'border-color': 'transparent transparent transparent '+getOptions().controlArrowColor});\n        utils.css(utils.$(SLIDES_ARROW_PREV_SEL, sectionElem), {'border-color': 'transparent '+ getOptions().controlArrowColor + ' transparent transparent'});\n    }\n\n    if(!getOptions().loopHorizontal){\n        utils.hide(utils.$(SLIDES_ARROW_PREV_SEL, sectionElem));\n    }\n}\n\nexport function toggleControlArrows(v){\n    if(!getOptions().loopHorizontal && getOptions().controlArrows){\n        //hidding it for the fist slide, showing for the rest\n        utils.toggle(utils.$(SLIDES_ARROW_PREV_SEL, v.section), v.slideIndex!==0);\n\n        //hidding it for the last slide, showing for the rest\n        utils.toggle(utils.$(SLIDES_ARROW_NEXT_SEL, v.section), utils.next(v.destiny) != null);\n    }\n}"
  },
  {
    "path": "src/js/autoScrolling.js",
    "content": "import * as utils from './common/utils.js';\nimport { silentScroll } from './common/silentScroll.js';\nimport { getScrollSettings } from './common/utilsFP.js';\nimport { \n    setVariableState,\n    getOptions,\n    getOriginals,\n    getContainer\n} from './common/options.js';\nimport { getState } from './common/state.js';\nimport { FP } from './common/constants.js';\nimport { $body, $htmlBody } from './common/cache.js';\nimport { setRecordHistory } from './anchors/setRecordHistory.js';\nimport { SCROLLABLE } from './common/selectors.js';\n\nFP.setAutoScrolling = setAutoScrolling;\nFP.test.setAutoScrolling = setAutoScrolling;\n\n/**\n* Sets the autoScroll option.\n* It changes the scroll bar visibility and the history of the site as a result.\n*/\nexport function setAutoScrolling(value, type){\n    //removing the transformation\n    if(!value){\n        silentScroll(0);\n    }\n    \n    setVariableState('autoScrolling', value, type);\n\n    var element = getState().activeSection.item;\n\n    if(getOptions().autoScrolling && !getOptions().scrollBar){\n        utils.css($htmlBody, {\n            'overflow': 'hidden',\n            'height': '100%'\n        });\n\n        utils.removeClass($body, SCROLLABLE);\n        setRecordHistory(getOriginals().recordHistory, 'internal');\n\n        //for IE touch devices\n        utils.css(getContainer(), {\n            '-ms-touch-action': 'none',\n            'touch-action': 'none'\n        });\n\n        if(element != null){\n            //moving the container up\n            silentScroll(element.offsetTop);\n        }\n    }else{\n        utils.css($htmlBody, {\n            'overflow' : 'visible',\n            'height' : 'initial'\n        });\n\n        utils.addClass($body, SCROLLABLE);\n\n        var recordHistory = !getOptions().autoScrolling ? false : getOriginals().recordHistory;\n        setRecordHistory(recordHistory, 'internal');\n\n        //for IE touch devices\n        utils.css(getContainer(), {\n            '-ms-touch-action': '',\n            'touch-action': ''\n        });\n\n        //scrolling the page to the section with no animation\n        if (element != null) {\n            var scrollSettings = getScrollSettings(element.offsetTop);\n            scrollSettings.element.scrollTo(0, scrollSettings.options);\n        }\n    }\n}"
  },
  {
    "path": "src/js/beyondFullpage/beyondFullPageHandler.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getState, setState } from \"../common/state.js\";\nimport { setPrevTime } from '../common/tick.js';\nimport { wheelDataHandler } from './wheelDataHandler.js';\nimport { getScrollSettings } from '../common/utilsFP.js';\nimport { scrollUpToFullpage } from './scrollBeyondFullPage.js';\n\nexport function beyondFullPageHandler(container, e){\n    var curTime = new Date().getTime();\n    var pauseScroll = getState().isBeyondFullpage && container.getBoundingClientRect().bottom >= 0 && wheelDataHandler.getDirection() === 'up';\n    var g_isAboutToScrollToFullPage = getState().isAboutToScrollToFullPage;\n\n    if(g_isAboutToScrollToFullPage){\n        setPrevTime(curTime);\n        utils.preventDefault(e);\n        return false;\n    }\n\n    if(getState().isBeyondFullpage){\n        if(!pauseScroll){\n            keyframeTime('set', 'beyondFullpage', 1000);\n        }\n        else {\n            var shouldSetFixedPosition = !g_isAboutToScrollToFullPage && (!keyframeTime('isNewKeyframe', 'beyondFullpage') || !wheelDataHandler.isAccelerating() );\n            var scrollSettings;\n            if( shouldSetFixedPosition ){\n                scrollSettings = getScrollSettings(utils.getLast(getState().sections).item.offsetTop + utils.getLast(getState().sections).item.offsetHeight);\n                scrollSettings.element.scrollTo(0, scrollSettings.options);\n                setState({isAboutToScrollToFullPage: false});\n\n                utils.preventDefault(e);\n                return false;\n            }\n            else if( wheelDataHandler.isAccelerating() ){\n                pauseScroll = false;\n                setState({isAboutToScrollToFullPage: true});\n                setState({scrollTrigger: 'wheel'});\n\n                scrollUpToFullpage();\n                \n                utils.preventDefault(e);\n                return false;\n            }\n        }\n\n        if(!g_isAboutToScrollToFullPage){\n\n            // allow normal scrolling, but quitting\n            if(!pauseScroll){\n                return true;\n            }\n        }   \n    }\n}\n\nvar keyframeTime = (function(){\n    let isNew = false;\n    var frames = {};\n    var timeframes = {};\n\n    return function(action, name, timeframe){\n        switch(action){\n            case 'set':\n                frames[name] = new Date().getTime();\n                timeframes[name] = timeframe;\n                break;\n            case 'isNewKeyframe':\n                const current = new Date().getTime();\n                isNew = current - frames[name] > timeframes[name];\n                break;\n        }\n\n        return isNew;\n    };\n})();"
  },
  {
    "path": "src/js/beyondFullpage/index.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getPassiveOptionsIfPossible } from '../common/supportsPassive.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { onKeyDown, scrollBeyondFullPage } from '../beyondFullpage/scrollBeyondFullPage.js';\nimport { wheelDataHandler } from './wheelDataHandler.js';\nimport { events } from '../common/events.js';\n\nEventEmitter.on(events.bindEvents, bindEvents);\n\nfunction bindEvents(){\n    utils.docAddEvent('wheel', wheelDataHandler.registerEvent, getPassiveOptionsIfPossible());\n    EventEmitter.on(events.scrollBeyondFullpage, scrollBeyondFullPage);\n    EventEmitter.on(events.onKeyDown, onKeyDown);\n\n}\n\n"
  },
  {
    "path": "src/js/beyondFullpage/scrollBeyondFullPage.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getScrollSettings, isFullPageAbove } from '../common/utilsFP.js';\nimport { getOptions } from '../common/options.js';\nimport { doc, FP } from '../common/constants.js';\nimport { $html, $htmlBody } from '../common/cache.js';\nimport { getState, setState } from '../common/state.js';\nimport { scrollTo } from '../common/scrollTo.js';\n\nexport function scrollBeyondFullPage(){\n    var dtop = getDestinationOffset();\n    var scrollSettings = getScrollSettings(dtop);\n    FP.test.top = -dtop + 'px';\n\n    setState({canScroll: false});\n    scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function(){\n        setTimeout(function(){\n            setState({isBeyondFullpage: true});\n            setState({canScroll: true});\n        },30);\n    });\n}\n\nexport function onKeyDown(){\n    if(!isFullPageAbove()){\n        return;\n    }else{\n        scrollUpToFullpage();\n    }    \n}\n\nexport function scrollUpToFullpage(){\n    var scrollSettings = getScrollSettings(utils.getLast(getState().sections).item.offsetTop);\n    setState({canScroll: false});\n    \n    scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function(){\n        setState({canScroll: true});\n        setState({isBeyondFullpage: false});\n        setState({isAboutToScrollToFullPage: false});\n    });\n}\n\nfunction getDestinationOffset(){\n    if(!getOptions().css3){\n        return utils.getLast(getState().sections).item.offsetTop + utils.getLast(getState().sections).item.offsetHeight;\n    }\n    return utils.getScrollTop() +  utils.getWindowHeight();\n}"
  },
  {
    "path": "src/js/beyondFullpage/wheelDataHandler.js",
    "content": "\nimport { win } from '../common/constants.js';\nimport * as utils from '../common/utils.js';\n\nexport const wheelDataHandler = (function(){\n    var _prevTime = new Date().getTime();\n    var _scrollings = [];\n    var isScrollingVertically;\n    var direction;\n\n    return {\n        registerEvent: function(e){\n            e = e || win.event;\n            var value = e.wheelDelta || -e.deltaY || -e.detail;\n            var delta = Math.max(-1, Math.min(1, value));\n            var horizontalDetection = typeof e.wheelDeltaX !== 'undefined' || typeof e.deltaX !== 'undefined';\n            isScrollingVertically = (Math.abs(e.wheelDeltaX) < Math.abs(e.wheelDelta)) || (Math.abs(e.deltaX ) < Math.abs(e.deltaY) || !horizontalDetection);\n            var curTime = new Date().getTime();\n            direction = delta < 0 ? 'down': 'up';\n\n            //Limiting the array to 150 (lets not waste memory!)\n            if(_scrollings.length > 149){\n                _scrollings.shift();\n            }\n\n            //keeping record of the previous scrollings\n            _scrollings.push(Math.abs(value));\n\n            //time difference between the last scroll and the current one\n            var timeDiff = curTime - _prevTime;\n            _prevTime = curTime;\n\n            //haven't they scrolled in a while?\n            //(enough to be consider a different scrolling action to scroll another section)\n            if(timeDiff > 200){\n                //emptying the array, we dont care about old scrollings for our averages\n                _scrollings = [];\n            }  \n        },\n        isAccelerating: function(){\n            var averageEnd = utils.getAverage(_scrollings, 10);\n            var averageMiddle = utils.getAverage(_scrollings, 70);\n            var isAccelerating = averageEnd >= averageMiddle;\n\n            return _scrollings.length ? isAccelerating && isScrollingVertically : false;\n        },\n\n        getDirection: function(){\n            return direction;\n        }\n    };\n})();\n"
  },
  {
    "path": "src/js/bindings.js",
    "content": "import * as utils from './common/utils.js';\nimport { EventEmitter } from './common/eventEmitter.js';\nimport { setState } from './common/state.js';\nimport { events } from './common/events.js';\n\nEventEmitter.on(events.bindEvents, bindEvents);\n\nfunction bindEvents(){\n\n    //Scrolls to the section when clicking the navigation bullet\n    //simulating the jQuery .on('click') event using delegation\n    ['click', 'touchstart'].forEach(function(eventName){\n        utils.docAddEvent(eventName, delegatedEvents);\n    });\n\n    utils.windowAddEvent('focus', focusHandler);\n\n    internalEvents();\n}\n\nfunction internalEvents(){\n    EventEmitter.on(events.onDestroy, onDestroy); \n}\n\nfunction delegatedEvents(e){\n    EventEmitter.emit(events.onClickOrTouch, {e: e, target: e.target});\n}\n\nfunction onDestroy(){\n    ['click', 'touchstart'].forEach(function(eventName){\n        utils.docRemoveEvent(eventName, delegatedEvents);\n    });\n}\n\n\n// changing isWindowFocused to true on focus event\nfunction focusHandler(){\n    setState({isWindowFocused: true});\n}\n"
  },
  {
    "path": "src/js/callbacks/fireCallback.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions, getContainer } from '../common/options.js';\nimport { nullOrSection } from './nullOrSection.js';\nimport { nullOrSlide } from './nullOrSlide.js';\nimport { getState } from '../common/state.js';\n\n/**\n* Dispatch events & callbacks\n*/\nexport function fireCallback(eventName, v){\n    var eventData = getEventData(eventName, v);\n    utils.trigger(getContainer(), eventName, eventData);\n\n    if(getOptions()[eventName].apply(eventData[Object.keys(eventData)[0]], utils.toArray(eventData)) === false){\n        return false;\n    }\n    return true;\n}\n\n\n/**\n* Gets the event's data for the given event on the right format.\n*/\nfunction getEventData(eventName, v){\n\n    //using functions to run only the necessary bits within the object\n    var paramsPerEvent = {\n        afterRender: function(){\n            return {\n                section: nullOrSection(getState().activeSection),\n                slide: nullOrSlide(getState().activeSection.activeSlide)\n            };\n        },\n        onLeave: function(){\n            return {\n                origin: nullOrSection(v.items.origin),\n                destination: nullOrSection(v.items.destination),\n                direction: v.direction,\n                trigger: getState().scrollTrigger\n            };\n        },\n\n        afterLoad: function(){\n            return paramsPerEvent.onLeave();\n        },\n\n        afterSlideLoad: function(){\n            return {\n                section: nullOrSection(v.items.section),\n                origin: nullOrSection(v.items.origin),\n                destination: nullOrSection(v.items.destination),\n                direction: v.direction,\n                trigger: getState().scrollTrigger\n            };\n        },\n\n        onSlideLeave: function(){\n            return paramsPerEvent.afterSlideLoad();\n        },\n\n        beforeLeave: function(){ \n            return paramsPerEvent.onLeave();\n        },\n\n        onScrollOverflow: function(){\n            return {\n                section: nullOrSection(getState().activeSection),\n                slide: nullOrSlide(getState().activeSection.activeSlide),\n                position: v.position,\n                direction: v.direction\n            };\n        }\n    };\n\n    return paramsPerEvent[eventName]();\n}\n"
  },
  {
    "path": "src/js/callbacks/fireCallbacksOncePerScroll.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions, getContainer } from '../common/options.js';\nimport { oncePerScroll } from '../common/tick.js';\nimport { getState } from '../common/state.js';\nimport { fireCallback } from './fireCallback.js';\n\n/**\n* Fires the wheel event once per mouse wheel trigger.\n*/\nexport function fireCallbackOncePerScroll(callbackName, params){\n    if(!utils.isFunction( getOptions().beforeLeave)){\n        return;\n    }\n\n    const result = oncePerScroll(getState().scrollTrigger, function(){\n        return fireCallback(callbackName, params);\n    });\n\n    return result;\n}"
  },
  {
    "path": "src/js/callbacks/nullOrSection.js",
    "content": "import { Section } from \"../common/item.js\";\nimport { SectionPanel } from \"../stateUpdates.js\";\n\n/**\n* Makes sure to only create a Panel object if the element exist\n*/\nexport function nullOrSection(el){\n    if(el && !el.item){\n        return new Section(new SectionPanel(el));\n    }\n    return el ? new Section(el) : null;\n}"
  },
  {
    "path": "src/js/callbacks/nullOrSlide.js",
    "content": "import { Slide } from \"../common/item.js\";\n\nexport function nullOrSlide(el){\n    return el ? new Slide(el) : null;\n}"
  },
  {
    "path": "src/js/common/addTableClass.js",
    "content": "import * as utils from './utils.js';\nimport { getOptions } from \"./options.js\";\nimport { TABLE } from './selectors.js';\nimport { scrollOverflowHandler } from '../scrolloverflow.js';\n\nexport function addTableClass(element){\n\n    if(!getOptions().verticalCentered){\n        return;\n    }\n\n    // Overflowing sections when scrollOverflow is disabled will be autoHeight\n    // and won't require vertical aligment\n    if( !getOptions().scrollOverflow && \n        scrollOverflowHandler.shouldBeScrollable(element.item)\n    ){\n        return;\n    }\n\n    if(!scrollOverflowHandler.isScrollable(element)){\n\n        //In case we are styling for the 2nd time as in with reponsiveSlides\n        if(!utils.hasClass(element.item, TABLE)){\n            utils.addClass(element.item, TABLE);\n        }\n    }\n}"
  },
  {
    "path": "src/js/common/cache.js",
    "content": "import * as utils from './utils.js';\n\nexport let $body = null;\nexport let $html = null;\nexport let $htmlBody = null;\n\n\n// caching common elements\nexport function setCache(){\n    $body = utils.$('body')[0];\n    $html = utils.$('html')[0];\n    $htmlBody = utils.$('html, body');\n}"
  },
  {
    "path": "src/js/common/constants.js",
    "content": "export const win = window;\nexport const doc = document;\n\nexport const isTouchDevice = navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/)\n                            || (navigator.userAgent.includes(\"Mac\") && \"ontouchend\" in document); // iPad on iOS 13 detection\nexport const isMacDevice = /(Mac|iPhone|iPod|iPad)/i.test(win.navigator.userAgent);\n// @ts-ignore\nexport const isTouch = (('ontouchstart' in win) || (navigator.msMaxTouchPoints > 0) || (navigator.maxTouchPoints));\nexport const isIE11 = !!window.MSInputMethodContext && !!document.documentMode;\n\n// taken from https://github.com/udacity/ud891/blob/gh-pages/lesson2-focus/07-modals-and-keyboard-traps/solution/modal.js\nexport const focusableElementsString = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex=\"0\"], summary:not([disabled]), [contenteditable]';\n\n// cache common elements\nexport const FP = {\n    test: {},\n    shared: {}\n};\n\nexport const extensions = [\n    'parallax',\n    'scrollOverflowReset',\n    'dragAndMove',\n    'offsetSections',\n    'fadingEffect',\n    'responsiveSlides',\n    'continuousHorizontal',\n    'interlockedSlides',\n    'scrollHorizontally',\n    'resetSliders',\n    'cards',\n    'dropEffect',\n    'waterEffect'\n];\n\nexport const isInsideIframe = (function() {\n    const inIframe = window.self !== window.top;\n    return function() {\n        return inIframe;\n    };\n})();"
  },
  {
    "path": "src/js/common/eventEmitter.js",
    "content": "export const EventEmitter = {\n    events: {},\n    on(event, listener) {\n        if (typeof this.events[event] !== 'object') {\n            this.events[event] = [];\n        }\n        this.events[event].push(listener);\n        return () => this.removeListener(event, listener);\n    },\n    removeListener(event, listener) {\n      if (typeof this.events[event] === 'object') {\n          const idx = this.events[event].indexOf(listener);\n          if (idx > -1) {\n            this.events[event].splice(idx, 1);\n          }\n      }\n    },\n    emit(event, ...args) {\n      if (typeof this.events[event] === 'object') {\n        this.events[event].forEach(listener => listener.apply(this, args));\n      }\n    },\n    once(event, listener) {\n      const remove = this.on(event, (...args) => {\n          remove();\n          listener.apply(this, args);\n      });\n    }\n};"
  },
  {
    "path": "src/js/common/events.js",
    "content": "export const events = {\n    onAfterRenderNoAnchor: 'onAfterRenderNoAnchor',\n    onClickOrTouch: 'onClickOrTouch',\n    moveSlideLeft: 'moveSlideLeft',\n    moveSlideRight: 'moveSlideRight',\n    onInitialise: 'onInitialise',\n    beforeInit: 'beforeInit',\n    bindEvents: 'bindEvents',\n    onDestroy: 'onDestroy',\n    onDestroyAll: 'onDestroyAll',\n    contentChanged: 'contentChanged',\n    onScrollOverflowScrolled: 'onScrollOverflowScrolled',\n    onScrollPageAndSlide: 'onScrollPageAndSlide',\n    onKeyDown: 'onKeyDown',\n    onMenuClick: 'onMenuClick',\n    scrollPage: 'scrollPage',\n    landscapeScroll: 'landscapeScroll',\n    scrollBeyondFullpage: 'scrollBeyondFullpage',\n    onPerformMovement: 'onPerformMovement',\n    onSlideLeave: 'onSlideLeave',\n    onLeave: 'onLeave',\n    afterSectionLoads: 'afterSectionLoads',\n    afterSlideLoads: 'afterSlideLoads',\n};"
  },
  {
    "path": "src/js/common/getSectionByAnchor.js",
    "content": "import { getState } from \"./state.js\";\n\n/**\n* Gets a section by its anchor / index\n*/\nexport function getSectionByAnchor(sectionAnchor){\n    var section = getState().sections.filter(section => section.anchor === sectionAnchor)[0];\n    if(!section){\n        var sectionIndex = typeof sectionAnchor !== 'undefined' ? sectionAnchor -1 : 0;\n        section = getState().sections[sectionIndex];\n    }\n\n    return section;\n}"
  },
  {
    "path": "src/js/common/isScrollAllowed.js",
    "content": "import * as utils from './utils.js';\n\nlet isScrollAllowed = {};\nisScrollAllowed.m = {  'up':true, 'down':true, 'left':true, 'right':true };\nisScrollAllowed.k = utils.deepExtend({}, isScrollAllowed.m);\n\n/**\n* Allowing or disallowing the mouse/swipe scroll in a given direction. (not for keyboard)\n* @param type m (mouse) or k (keyboard)\n*/\nexport function setIsScrollAllowed(value, direction, type){\n    //up, down, left, right\n    if(direction !== 'all'){\n        isScrollAllowed[type][direction] = value;\n    }\n\n    //all directions?\n    else{\n        Object.keys(isScrollAllowed[type]).forEach(function(key){\n            isScrollAllowed[type][key] = value;\n        });\n    }\n}\n\nexport function getIsScrollAllowed(){\n    return isScrollAllowed;\n}"
  },
  {
    "path": "src/js/common/item.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions } from '../common/options.js';\nimport { state } from '../common/state.js';\nimport { \n    ACTIVE,\n    OVERFLOW,\n    OVERFLOW_SEL,\n    SLIDES_CONTAINER_SEL,\n    WRAPPER_SEL\n } from '../common/selectors.js';\nexport const plainItem = function(panel){\n    this.anchor = panel.anchor;\n    this.item = panel.item;\n    this.index = panel.index();\n    this.isLast = this.index === panel.item.parentElement.querySelectorAll(panel.selector).length -1;\n    this.isFirst = !this.index;\n    this.isActive = panel.isActive;\n};\n\n\n/**\n* Item. Slide or Section objects share the same properties.\n*/\nexport const Item = function(el, selector){\n    this.parent = this.parent || null;\n    this.selector = selector;\n    this.anchor = utils.getAttr(el, 'data-anchor') || getOptions().anchors[utils.index(el, getOptions().sectionSelector)];\n    this.item = el;\n    this.isVisible = utils.isVisible(el);\n    this.isActive = utils.hasClass(el, ACTIVE);\n    this.hasScroll = utils.hasClass(el, OVERFLOW) || utils.$(OVERFLOW_SEL, el)[0] != null;\n    this.isSection = selector === getOptions().sectionSelector;\n    this.container = utils.closest(el, SLIDES_CONTAINER_SEL) || utils.closest(el, WRAPPER_SEL);\n    this.index = function(){\n        return this.siblings().indexOf(this);\n    };\n};\n\nItem.prototype.siblings = function(){\n    if(this.isSection){\n        if(this.isVisible){\n            return state.sections;\n        }\n        else{\n            return state.sectionsIncludingHidden;\n        }\n    }\n    \n    return this.parent ? this.parent.slides : 0;\n};\n\nItem.prototype.prev = function(){\n    var siblings = this.siblings();\n    var currentIndex = this.isSection ? siblings.indexOf(this) : this.parent.slides.indexOf(this);\n    var prevIndex = currentIndex - 1;\n    if(prevIndex >= 0){\n        return siblings[prevIndex];\n    }\n    return null;\n};\n\nItem.prototype.next = function(){\n    var siblings = this.siblings();\n    var currentIndex = this.isSection ? siblings.indexOf(this) : this.parent.slides.indexOf(this);\n    var nextIndex = currentIndex + 1;\n    if(nextIndex < siblings.length){\n        return siblings[nextIndex];\n    }\n    return null;            \n};\n\nItem.prototype[\"prevPanel\"] = function(){\n    return this.prev() || (this.parent ? this.parent.prev() : null);\n};\n\nItem.prototype[\"nextPanel\"] = function(){\n    return this.next() || (this.parent ? this.parent.next() : null);\n};\n\nItem.prototype.getSiblings = function(){\n    if(this.isSection){\n        return state.sections;\n    }\n    return state.panels;\n};\n\nexport function getNodes(panels){\n    return panels.map(panel => panel.item);\n}\n\nexport function getPanelByElement(panels, el){\n    return panels.find(function(panel){\n        return panel.item === el;\n    });\n}\n\nexport const Section = function(el){\n    plainItem.call(this, el);\n};\n\nexport const Slide = function(el){\n    plainItem.call(this, el);\n};"
  },
  {
    "path": "src/js/common/options.js",
    "content": "import * as utils from './utils.js';\nimport { defaultOptions } from '../optionsDefault.js';\n\nlet container = null;\nlet g_initialAnchorsInDom = false;\nlet originals = utils.deepExtend({}, defaultOptions); //deep copy\nvar g_options = null;\n\nexport function getInitialAnchorsInDom(){\n    return g_initialAnchorsInDom;\n}\n\nexport function setContainer(value){\n    container = value;\n}\n\nexport function getContainer(value){\n    return container;\n}\n\nexport function getOptions(){\n    return g_options || defaultOptions;\n}\n\nexport function setOptions(options){\n    g_options = utils.deepExtend({}, defaultOptions, options);\n    originals = Object.assign({}, g_options);\n}\n\nexport function getOriginals(){\n    return originals;\n}\n\nexport function setOption(name, value){\n    defaultOptions[name] = value;\n}\n\n/*\n* Sets the state for a variable with multiple states (original, and temporal)\n* Some variables such as `autoScrolling` or `recordHistory` might change automatically its state when using `responsive` or `autoScrolling:false`.\n* This function is used to keep track of both states, the original and the temporal one.\n* If type is not 'internal', then we assume the user is globally changing the variable.\n*/\nexport function setVariableState(variable, value, type){\n    g_options[variable] = value;\n    if(type !== 'internal'){\n        originals[variable] = value;\n    }\n}\n\n/**\n* Setting options from DOM elements if they are not provided.\n*/\nexport function setOptionsFromDOM(){\n\n    //no anchors option? Checking for them in the DOM attributes\n    if(!getOptions().anchors.length){\n        var anchorsAttribute = '[data-anchor]';\n        var anchors = utils.$(getOptions().sectionSelector.split(',').join(anchorsAttribute + ',') + anchorsAttribute, container);\n        if(anchors.length && anchors.length === utils.$(getOptions().sectionSelector, container).length){\n            g_initialAnchorsInDom = true;\n            anchors.forEach(function(item){\n                getOptions().anchors.push(utils.getAttr(item, 'data-anchor').toString());\n            });\n        }\n    }\n\n    //no tooltips option? Checking for them in the DOM attributes\n    if(!getOptions().navigationTooltips.length){\n        var tooltipsAttribute = '[data-tooltip]';\n        var tooltips = utils.$(getOptions().sectionSelector.split(',').join(tooltipsAttribute + ',') + tooltipsAttribute, container);\n        if(tooltips.length){\n            tooltips.forEach(function(item){\n                getOptions().navigationTooltips.push(utils.getAttr(item, 'data-tooltip').toString());\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/js/common/scrollTo.js",
    "content": "//@ts-check\nimport * as utils from './utils.js';\nimport { setScrolling } from './utilsFP.js';\nimport { state, setState } from \"./state.js\";\nimport { getOptions } from './options.js';\nimport { SLIDES_WRAPPER } from './selectors.js';\nimport { win } from './constants.js';\nimport { $html } from './cache.js';\n\nvar g_animateScroll;\n\n/**\n* Simulates the animated scrollTop of jQuery. Used when css3:false or scrollBar:true or autoScrolling:false\n* http://stackoverflow.com/a/16136789/1081396\n*/\nexport function scrollTo(element, to, duration, callback) {\n    var start = getScrolledPosition(element);\n    var change = to - start;\n    var isCallbackFired = false;\n    var startTime;\n    var wasAnimationActive = state.activeAnimation;\n\n    setState({activeAnimation: true});\n\n    // Cancelling any possible previous animations (io: clicking on nav dots very fast)\n    if(g_animateScroll){\n        window.cancelAnimationFrame(g_animateScroll);\n    }\n    g_animateScroll = function(timestamp){\n        if (!startTime){\n            startTime = timestamp;\n        }\n\n        var currentTime = Math.floor(timestamp - startTime);\n\n        if(state.activeAnimation){ //in order to stope it from other function whenever we want\n            var val = to;\n\n            if(duration){\n                // @ts-ignore\n                val = win.fp_easings[getOptions().easing](currentTime, start, change, duration);\n            }\n\n            if(currentTime <= duration) {\n                setScrolling(element, val);\n            }\n\n            if(currentTime < duration) {\n                window.requestAnimationFrame(g_animateScroll);\n            }else if(typeof callback !== 'undefined' && !isCallbackFired){\n                setScrolling(element, to);\n                callback();\n                setState({activeAnimation: false});\n                isCallbackFired = true;\n            }\n        }else if (!isCallbackFired && !wasAnimationActive){\n            callback();\n            setState({activeAnimation: false});\n            isCallbackFired = true;\n        }\n    };\n\n    window.requestAnimationFrame(g_animateScroll);\n}\n\n\n/**\n* Getting the position of the element to scroll when using jQuery animations\n*/\nfunction getScrolledPosition(element){\n    var position;\n\n    //is not the window element and is a slide?\n    if(element.self != win && utils.hasClass(element, SLIDES_WRAPPER)){\n        position = element.scrollLeft;\n    }\n    else if(!getOptions().autoScrolling || getOptions().scrollBar){\n        position = utils.getScrollTop();\n    }\n    else{\n        position = element.offsetTop;\n    }\n\n    //gets the top property of the wrapper\n    return position;\n}"
  },
  {
    "path": "src/js/common/selectors.js",
    "content": "\n// keeping central set of classnames and selectors\nexport const WRAPPER =               'fullpage-wrapper';\nexport const WRAPPER_SEL =           '.' + WRAPPER;\n\n// slimscroll\nexport const SCROLLABLE =            'fp-scrollable';\nexport const SCROLLABLE_SEL =        '.' + SCROLLABLE;\n\n// util\nexport const RESPONSIVE =            'fp-responsive';\nexport const NO_TRANSITION =         'fp-notransition';\nexport const DESTROYED =             'fp-destroyed';\nexport const ENABLED =               'fp-enabled';\nexport const VIEWING_PREFIX =        'fp-viewing';\nexport const ACTIVE =                'active';\nexport const ACTIVE_SEL =            '.' + ACTIVE;\nexport const COMPLETELY =            'fp-completely';\nexport const COMPLETELY_SEL =        '.' + COMPLETELY;\nexport const LOADED =                'fp-loaded';\nexport const LOADED_SEL =            '.' + LOADED;\n\n// section\nexport const SECTION_DEFAULT_SEL =   '.section';\nexport const SECTION =               'fp-section';\nexport const SECTION_SEL =           '.' + SECTION;\nexport const SECTION_ACTIVE_SEL =    SECTION_SEL + ACTIVE_SEL;\nexport const TABLE_CELL =            'fp-tableCell';\nexport const TABLE_CELL_SEL =        '.' + TABLE_CELL;\nexport const AUTO_HEIGHT =           'fp-auto-height';\nexport const AUTO_HEIGHT_SEL =       '.' + AUTO_HEIGHT;\nexport const AUTO_HEIGHT_RESPONSIVE = 'fp-auto-height-responsive';\nexport const AUTO_HEIGHT_RESPONSIVE_SEL = '.' + AUTO_HEIGHT_RESPONSIVE;\nexport const NORMAL_SCROLL =         'fp-normal-scroll';\nexport const NORMAL_SCROLL_SEL =     '.' + NORMAL_SCROLL;\n\n// section nav\nexport const SECTION_NAV =           'fp-nav';\nexport const SECTION_NAV_SEL =       '#' + SECTION_NAV;\nexport const SECTION_NAV_TOOLTIP =   'fp-tooltip';\nexport const SECTION_NAV_TOOLTIP_SEL='.'+SECTION_NAV_TOOLTIP;\nexport const SHOW_ACTIVE_TOOLTIP =   'fp-show-active';\n\n// slide\nexport const SLIDE_DEFAULT_SEL =     '.slide';\nexport const SLIDE =                 'fp-slide';\nexport const SLIDE_SEL =             '.' + SLIDE;\nexport const SLIDE_ACTIVE_SEL =      SLIDE_SEL + ACTIVE_SEL;\nexport const SLIDES_WRAPPER =        'fp-slides';\nexport const SLIDES_WRAPPER_SEL =    '.' + SLIDES_WRAPPER;\nexport const SLIDES_CONTAINER =      'fp-slidesContainer';\nexport const SLIDES_CONTAINER_SEL =  '.' + SLIDES_CONTAINER;\nexport const TABLE =                 'fp-table';\nexport const OVERFLOW =              'fp-overflow';\nexport const OVERFLOW_SEL =          '.' + OVERFLOW;\nexport const IS_OVERFLOW =           'fp-is-overflow';\n\n// slide nav\nexport const SLIDES_NAV =            'fp-slidesNav';\nexport const SLIDES_NAV_SEL =        '.' + SLIDES_NAV;\nexport const SLIDES_NAV_LINK_SEL =   SLIDES_NAV_SEL + ' a';\nexport const SLIDES_STYLED_ARROW =   'fp-arrow';\nexport const SLIDES_ARROW =          'fp-controlArrow';\nexport const SLIDES_ARROW_SEL =      '.' + SLIDES_ARROW;\nexport const SLIDES_PREV =           'fp-prev';\nexport const SLIDES_PREV_SEL =       '.' + SLIDES_PREV;\nexport const SLIDES_ARROW_PREV =     SLIDES_ARROW + ' ' + SLIDES_PREV;\nexport const SLIDES_ARROW_PREV_SEL = SLIDES_ARROW_SEL + SLIDES_PREV_SEL;\nexport const SLIDES_NEXT =           'fp-next';\nexport const SLIDES_NEXT_SEL =       '.' + SLIDES_NEXT;\nexport const SLIDES_ARROW_NEXT =     SLIDES_ARROW + ' ' + SLIDES_NEXT;\nexport const SLIDES_ARROW_NEXT_SEL = SLIDES_ARROW_SEL + SLIDES_NEXT_SEL;\n\n// Watermark\nexport const WATERMARK = 'fp-watermark';\nexport const WATERMARK_SEL = '.' + WATERMARK;"
  },
  {
    "path": "src/js/common/silentScroll.js",
    "content": "import * as utils from './utils.js';\nimport { getOptions, getContainer } from './options.js';\nimport { transformContainer } from './transformContainer.js';\nimport { FP } from './constants.js';\nimport { getScrollSettings, setScrolling } from './utilsFP.js';\n/**\n* Scrolls silently (with no animation) the page to the given Y position.\n*/\nexport function silentScroll(top){\n    // The first section can have a negative value in iOS 10. Not quite sure why: -0.0142822265625\n    // that's why we round it to 0.\n    var roundedTop = Math.round(top);\n\n    if (getOptions().css3 && getOptions().autoScrolling && !getOptions().scrollBar){\n        var translate3d = 'translate3d(0px, -' + roundedTop + 'px, 0px)';\n        transformContainer(translate3d, false);\n    }\n    else if(getOptions().autoScrolling && !getOptions().scrollBar){\n        utils.css(getContainer(), {'top': -roundedTop + 'px'});\n        FP.test.top = -roundedTop + 'px';\n    }\n    else{\n        var scrollSettings = getScrollSettings(roundedTop);\n        setScrolling(scrollSettings.element, scrollSettings.options);\n    }\n}"
  },
  {
    "path": "src/js/common/state.js",
    "content": "import * as utils from './utils.js';\nimport { win } from './constants.js';\n\nconst defaultState = {\n    numSections: 0,\n    numSlides: 0,\n    slides: [],\n    sections: [],\n    activeSection: null,\n    scrollTrigger: null,\n    isBeyondFullpage: false,\n    aboutToScrollToFullPage: false,\n    slideMoving: false,\n    isResizing: false,\n    isScrolling: false,\n    lastScrolledDestiny: undefined,\n    lastScrolledSlide: undefined,\n    activeAnimation: false,\n    canScroll: true,\n    touchDirection: 'none',\n    wheelDirection: 'none',\n    isGrabbing: false,\n    isUsingWheel: false,\n    isWindowFocused: true,\n    previousDestTop: 0,\n    windowsHeight: utils.getWindowHeight(),\n    isDoingContinousVertical: false,\n    timeouts: {},\n    scrollY: 0,\n    scrollX: 0,\n    isFullpageInitDone: false,\n};\n\nexport const state = Object.assign({}, defaultState);\n\n// @ts-ignore\nwin.state = state;\n\nexport function setState(props){\n    Object.assign(state, props);\n}\n\nexport function getState(){\n    return state;\n}\n\nexport function getActiveDefaultSection(sections){\n    var section = sections.filter(section => section.isActive);\n\n    if(!section.length){\n        return sections[0];\n    }\n    return section[0];\n}\n\nexport function getActivePanel(){\n    return state.activeSection && state.activeSection.activeSlide ? state.activeSection.activeSlide : state.activeSection;\n}\n\nexport function resetState(){\n    setState(defaultState);\n}"
  },
  {
    "path": "src/js/common/supportsPassive.js",
    "content": "import * as utils from './utils.js';\n\nconst supportsPassiveEvents = (function(){\n    //cheks for passive event support\n    var g_supportsPassive = false;\n    \n    try {\n        var opts = Object.defineProperty({}, 'passive', {\n            get: function() {\n                g_supportsPassive = true;\n            }\n        });\n        utils.windowAddEvent(\"testPassive\", null, opts);\n        utils.windowRemoveEvent(\"testPassive\", null, opts);\n    } catch (e) {\n\n    }\n\n    return function(){\n        return g_supportsPassive;\n    };\n})();\n\nexport function getPassiveOptionsIfPossible(){\n    return supportsPassiveEvents() ? { passive: false } : false;\n}"
  },
  {
    "path": "src/js/common/tick.js",
    "content": "import { win } from './constants.js';\nimport { getOptions } from './options.js';\n\nlet prevTime = new Date().getTime();\n\nexport function setPrevTime(value){\n    prevTime = value;\n}\n\nexport function getPrevTime(value){\n    return prevTime;\n}\n\n/**\n * Triggers the callback once per scroll wheel action.\n * Based on scrolling speed delay.\n */\nexport const oncePerScroll = (function() {\n    var canTriggerEvent = true;\n    var prevWheelTime = new Date().getTime();\n    var result;\n    var isScrollingOnInit = !win.fullpage_api;\n    \n    return function(scrollTrigger, callback){\n        var currentTime = new Date().getTime();\n        var timeThreshold = scrollTrigger === 'wheel' ? getOptions().scrollingSpeed : 100;\n        canTriggerEvent = isScrollingOnInit || currentTime - prevWheelTime >= timeThreshold;\n        isScrollingOnInit = !win.fullpage_api;\n        \n        if(canTriggerEvent){\n            result = callback();\n            prevWheelTime = currentTime;\n        }\n        return typeof result !== 'undefined' ? result : true;              \n    };\n})();"
  },
  {
    "path": "src/js/common/transformContainer.js",
    "content": "import * as utils from './utils.js';\nimport { FP } from './constants.js';\nimport { NO_TRANSITION } from './selectors.js';\nimport { getContainer } from \"./options.js\";\nimport { addAnimation, removeAnimation, getTransforms } from './utilsFP.js';\n\nlet silentScrollId;\n\n/**\n* Adds a css3 transform property to the container class with or without animation depending on the animated param.\n*/\nexport function transformContainer(translate3d, animated){\n    if(animated){\n        addAnimation(getContainer());\n    }else{\n        removeAnimation(getContainer());\n    }\n\n    clearTimeout(silentScrollId);\n    utils.css(getContainer(), getTransforms(translate3d));\n    FP.test.translate3d = translate3d;\n\n    //syncronously removing the class after the animation has been applied.\n    silentScrollId = setTimeout(function(){\n        utils.removeClass(getContainer(), NO_TRANSITION);\n    },10);\n}"
  },
  {
    "path": "src/js/common/utils.js",
    "content": "//utils\n\nimport { doc, win } from \"./constants.js\";\n\n/**\n* Shows a message in the console of the given type.\n*/\nexport function showError(type, text){\n    win.console && win.console[type] && win.console[type]('fullPage: ' + text);\n}\n\nexport function isVisible(el){\n    var style = win.getComputedStyle(el);\n\n    return (style.display !== 'none');\n}\n\nexport function getVisible(elements){\n    return Array.from(elements).filter(function(e){\n        return isVisible(e);\n    });\n}\n\n/**\n* Equivalent of jQuery function $().\n*/\nexport function $(selector, context){\n    context = arguments.length > 1 ? context : document;\n    return context ? context.querySelectorAll(selector) : null;\n}\n\n/**\n* Extends a given Object properties and its childs.\n*/\nexport function deepExtend(out) {\n    out = out || {};\n    for (var i = 1, len = arguments.length; i < len; ++i) {\n      var obj = arguments[i];\n  \n      if (!obj) {\n        continue;\n      }\n  \n      for (var key in obj) {\n        if (!obj.hasOwnProperty(key) || key == '__proto__' || key == 'constructor') {\n          continue;\n        }\n  \n        // based on https://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/\n        if (Object.prototype.toString.call(obj[key]) === '[object Object]') {\n          out[key] = deepExtend(out[key], obj[key]);\n          continue;\n        }\n  \n        out[key] = obj[key];\n      }\n    }\n    return out;\n}\n\n/**\n* Checks if the passed element contains the passed class.\n*/\nexport function hasClass(el, className){\n    if(el == null){\n        return false;\n    }\n    return el.classList.contains(className);\n}\n\n/**\n* Gets the window height. Crossbrowser.\n*/\nexport function getWindowHeight(){\n    return 'innerHeight' in win ? win.innerHeight : doc.documentElement.offsetHeight;\n}\n\n/**\n* Gets the window width.\n*/\nexport function getWindowWidth(){\n    return win.innerWidth;\n}\n\n/**\n* Set's the CSS properties for the passed item/s.\n* @param {NodeList|HTMLElement|Object} items\n* @param {Object} props css properties and values.\n*/\nexport function css(items, props) {\n    items = getList(items);\n\n    var key;\n    for (key in props) {\n        if (props.hasOwnProperty(key)) {\n            if (key !== null) {\n                for (var i = 0; i < items.length; i++) {\n                    var item = items[i];\n                    item.style[key] = props[key];\n                }\n            }\n        }\n    }\n\n    return items;\n}\n\n/**\n* Gets the previous element to the passed element.\n*/\nexport function prev(item){\n    return item.previousElementSibling;\n}\n\n/**\n* Gets the next element to the passed element.\n*/\nexport function next(item){\n    return item.nextElementSibling;\n}\n\n/**\n* Gets the last element from the passed list of elements.\n*/\nexport function last(item){\n    return item[item.length-1];\n}\n\n/**\n* Gets index from the passed element.\n* @param {String} selector is optional.\n*/\nexport function index(item, selector) {\n    item = isArrayOrList(item) ? item[0] : item;\n    var children = selector != null? $(selector, item.parentNode) : item.parentNode.childNodes;\n    var num = 0;\n    for (var i=0; i<children.length; i++) {\n            if (children[i] == item) return num;\n            if (children[i].nodeType==1) num++;\n    }\n    return -1;\n}\n\n/**\n* Gets an iterable element for the passed element/s\n*/\nexport function getList(item){\n    return !isArrayOrList(item) ? [item] : item;\n}\n\n/**\n* Adds the display=none property for the passed element/s\n*/\nexport function hide(el){\n    el = getList(el);\n\n    for(var i = 0; i<el.length; i++){\n        el[i].style.display = 'none';\n    }\n    return el;\n}\n\n/**\n* Adds the display=block property for the passed element/s\n*/\nexport function show(el){\n    el = getList(el);\n\n    for(var i = 0; i<el.length; i++){\n        el[i].style.display = 'block';\n    }\n    return el;\n}\n\n/**\n* Checks if the passed element is an iterable element or not\n*/\nexport function isArrayOrList(el){\n    return Object.prototype.toString.call( el ) === '[object Array]' ||\n        Object.prototype.toString.call( el ) === '[object NodeList]';\n}\n\n/**\n* Adds the passed class to the passed element/s\n*/\nexport function addClass(el, className) {\n    el = getList(el);\n\n    for(var i = 0; i<el.length; i++){\n        var item = el[i];\n        item.classList.add(className);\n    }\n    return el;\n}\n\n/**\n* Removes the passed class to the passed element/s\n* @param {String} `className` can be multiple classnames separated by whitespace\n*/\nexport function removeClass(el, className){\n    el = getList(el);\n\n    var classNames = className.split(' ');\n\n    for(var a = 0; a<classNames.length; a++){\n        className = classNames[a];\n        for(var i = 0; i<el.length; i++){\n            var item = el[i];\n            item.classList.remove(className);            \n        }\n    }\n    return el;\n}\n\n/**\n* Appends the given element ot the given parent.\n*/\nexport function appendTo(el, parent){\n    parent.appendChild(el);\n}\n\n/**\nUsage:\n\nvar wrapper = document.createElement('div');\nwrapper.className = 'fp-slides';\nwrap($('.slide'), wrapper);\n\nhttps://jsfiddle.net/qwzc7oy3/15/ (vanilla)\nhttps://jsfiddle.net/oya6ndka/1/ (jquery equivalent)\n*/\nexport function wrap(toWrap, wrapper, isWrapAll) {\n    var newParent;\n    wrapper = wrapper || doc.createElement('div');\n    for(var i = 0; i < toWrap.length; i++){\n        var item = toWrap[i];\n        if(isWrapAll && !i || !isWrapAll){\n            newParent = wrapper.cloneNode(true);\n            item.parentNode.insertBefore(newParent, item);\n        }\n        newParent.appendChild(item);\n    }\n    return toWrap;\n}\n\n/**\nUsage:\nvar wrapper = document.createElement('div');\nwrapper.className = 'fp-slides';\nwrap($('.slide'), wrapper);\n\nhttps://jsfiddle.net/qwzc7oy3/27/ (vanilla)\nhttps://jsfiddle.net/oya6ndka/4/ (jquery equivalent)\n*/\nexport function wrapAll(toWrap, wrapper) {\n    wrap(toWrap, wrapper, true);\n}\n\n/**\n* Usage:\n* wrapInner(document.querySelector('#pepe'), '<div class=\"test\">afdas</div>');\n* wrapInner(document.querySelector('#pepe'), element);\n*\n* https://jsfiddle.net/zexxz0tw/6/\n*\n* https://stackoverflow.com/a/21817590/1081396\n*/\nexport function wrapInner(parent, wrapper) {\n    parent.appendChild(wrapper);\n\n    while(parent.firstChild !== wrapper){\n        wrapper.appendChild(parent.firstChild);\n    }\n}\n\n/**\n* Usage:\n* unwrap(document.querySelector('#pepe'));\n* unwrap(element);\n*\n* https://jsfiddle.net/szjt0hxq/1/\n*\n*/\nexport function unwrap(wrapper) {\n    var wrapperContent = doc.createDocumentFragment();\n    while (wrapper.firstChild) {\n        wrapperContent.appendChild(wrapper.firstChild);\n    }\n\n    wrapper.parentNode.replaceChild(wrapperContent, wrapper);\n}\n\n/**\n* http://stackoverflow.com/questions/22100853/dom-pure-javascript-solution-to-jquery-closest-implementation\n* Returns the element or `false` if there's none\n*/\nexport function closest(el, selector) {\n    if(el && el.nodeType === 1){\n        if(matches(el, selector)){\n            return el;\n        }\n        return closest(el.parentNode, selector);\n    }\n    return null;\n}\n\n/**\n* Places one element (rel) after another one or group of them (reference).\n* @param {HTMLElement} reference\n* @param {HTMLElement|NodeList|String|Array} el\n* https://jsfiddle.net/9s97hhzv/1/\n*/\nexport function after(reference, el) {\n    insertBefore(reference, reference.nextSibling, el);\n}\n\n/**\n* Places one element (rel) before another one or group of them (reference).\n* @param {HTMLElement} reference\n* @param {HTMLElement|NodeList|String|Array} el\n* https://jsfiddle.net/9s97hhzv/1/\n*/\nexport function before(reference, el) {\n    insertBefore(reference, reference, el);\n}\n\n/**\n* Based in https://stackoverflow.com/a/19316024/1081396\n* and https://stackoverflow.com/a/4793630/1081396\n*/\nexport function insertBefore(reference, beforeElement, el){\n    if(!isArrayOrList(el)){\n        if(typeof el == 'string'){\n            el = createElementFromHTML(el);\n        }\n        el = [el];\n    }\n\n    for(var i = 0; i<el.length; i++){\n        reference.parentNode.insertBefore(el[i], beforeElement);\n    }\n}\n\n//http://stackoverflow.com/questions/3464876/javascript-get-window-x-y-position-for-scroll\nexport function getScrollTop(){\n    var docElement = doc.documentElement;\n    return (win.pageYOffset || docElement.scrollTop)  - (docElement.clientTop || 0);\n}\n\n/**\n* Gets the siblings of the passed element\n*/\nexport function siblings(el){\n    return Array.prototype.filter.call(el.parentNode.children, function(child){\n        return child !== el;\n    });\n}\n\nexport function preventDefault(event){\n    event.preventDefault();\n}\n\nexport function getAttr(el, attr){\n    return el.getAttribute(attr);\n}\n\nexport function docAddEvent(event, callback, options){\n    doc.addEventListener(event, callback, options === 'undefined' ? null : options);\n}\n\nexport function windowAddEvent(event, callback, options){\n    win.addEventListener(event, callback, options === 'undefined' ? null : options);\n}\n\nexport function docRemoveEvent(event, callback, options){\n    doc.removeEventListener(event, callback, options === 'undefined' ? null : options);\n}\n\nexport function windowRemoveEvent(event, callback, options){\n    win.removeEventListener(event, callback, options === 'undefined' ? null : options);\n}\n\n/**\n* Determines whether the passed item is of function type.\n*/\nexport function isFunction(item) {\n    if (typeof item === 'function') {\n        return true;\n    }\n    var type = Object.prototype.toString.call(item);\n    return type === '[object Function]' || type === '[object GeneratorFunction]';\n}\n\n/**\n* Trigger custom events\n*/\nexport function trigger(el, eventName, data){\n    var event;\n    data = typeof data === 'undefined' ? {} : data;\n\n    // Native\n    if(typeof win.CustomEvent === \"function\" ){\n        event = new CustomEvent(eventName, {detail: data});\n    }\n    else{\n        event = doc.createEvent('CustomEvent');\n        event.initCustomEvent(eventName, true, true, data);\n    }\n\n    el.dispatchEvent(event);\n}\n\n/**\n* Polyfill of .matches()\n*/\nexport function matches(el, selector) {\n    return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector);\n}\n\n/**\n* Toggles the visibility of the passed element el.\n*/\nexport function toggle(el, value){\n    if(typeof value === \"boolean\"){\n        for(var i = 0; i<el.length; i++){\n            el[i].style.display = value ? 'block' : 'none';\n        }\n    }\n    //we don't use it in other way, so no else :)\n\n    return el;\n}\n\n/**\n* Creates a HTMLElement from the passed HTML string.\n* https://stackoverflow.com/a/494348/1081396\n*/\nexport function createElementFromHTML(htmlString) {\n    var div = doc.createElement('div');\n    div.innerHTML = htmlString.trim();\n\n    // Change this to div.childNodes to support multiple top-level nodes\n    return div.firstChild;\n}\n\n/**\n* Removes the passed item/s from the DOM.\n*/\nexport function remove(items){\n    items = getList(items);\n    for(var i = 0; i<items.length; i++){\n        var item = items[i];\n        if(item && item.parentElement) {\n            item.parentNode.removeChild(item);\n        }\n    }\n}\n\n//https://jsfiddle.net/w1rktecz/\nexport function untilAll(item, selector, fn){\n    var sibling = item[fn];\n    var siblings = [];\n    while(sibling){\n        if(matches(sibling, selector) || selector == null) {\n            siblings.push(sibling);\n        }\n        sibling = sibling[fn];\n    }\n\n    return siblings;\n}\n\n/**\n* Gets all next elements matching the passed selector.\n*/\nexport function nextAll(item, selector){\n    return untilAll(item, selector, 'nextElementSibling');\n}\n\n/**\n* Gets all previous elements matching the passed selector.\n*/\nexport function prevAll(item, selector){\n    return untilAll(item, selector, 'previousElementSibling');\n}\n\n/**\n* Converts an object to an array.\n*/\nexport function toArray(objectData){\n    return Object.keys(objectData).map(function(key) {\n        return objectData[key];\n    });\n}\n\nexport function getLast(items){\n    return items[items.length-1];\n}\n\n/**\n* Gets the average of the last `number` elements of the given array.\n*/\nexport function getAverage(elements, number){\n    var sum = 0;\n\n    //taking `number` elements from the end to make the average, if there are not enought, 1\n    var lastElements = elements.slice(Math.max(elements.length - number, 1));\n\n    for(var i = 0; i < lastElements.length; i++){\n        sum = sum + lastElements[i];\n    }\n\n    return Math.ceil(sum/number);\n}\n\n/**\n* Sets the value for the given attribute from the `data-` attribute with the same suffix\n* ie: data-srcset ==> srcset  |  data-src ==> src\n*/\nexport function setSrc(element, attribute){\n    element.setAttribute(attribute, getAttr(element, 'data-' + attribute));\n    element.removeAttribute('data-' + attribute);\n}\n\nexport function getParentsUntil(item, topParentSelector){\n    var parents = [item];\n\n    do{\n        item = item.parentNode;\n        parents.push(item);\n    }while(!matches(item, topParentSelector));\n\n    return parents;\n}\n\nexport function isInsideInput(){\n    var activeElement = doc.activeElement;\n\n    return matches(activeElement, 'textarea') || \n        matches(activeElement, 'input') || \n        matches(activeElement, 'select') ||\n        getAttr(activeElement, 'contentEditable') == \"true\" || \n        getAttr(activeElement, 'contentEditable') == '';\n}\n\n//utils are public, so we can use it wherever we want\n// @ts-ignore\nwindow[\"fp_utils\"] = {\n    \"$\": $,\n    \"deepExtend\": deepExtend,\n    \"hasClass\": hasClass,\n    \"getWindowHeight\": getWindowHeight,\n    \"css\": css,\n    \"prev\": prev,\n    \"next\": next,\n    \"last\": last,\n    \"index\": index,\n    \"getList\": getList,\n    \"hide\": hide,\n    \"show\": show,\n    \"isArrayOrList\": isArrayOrList,\n    \"addClass\": addClass,\n    \"removeClass\": removeClass,\n    \"appendTo\": appendTo,\n    \"wrap\": wrap,\n    \"wrapAll\": wrapAll,\n    \"unwrap\": unwrap,\n    \"closest\": closest,\n    \"after\": after,\n    \"before\": before,\n    \"insertBefore\": insertBefore,\n    \"getScrollTop\": getScrollTop,\n    \"siblings\": siblings,\n    \"preventDefault\": preventDefault,\n    \"isFunction\": isFunction,\n    \"trigger\": trigger,\n    \"matches\": matches,\n    \"toggle\": toggle,\n    \"createElementFromHTML\": createElementFromHTML,\n    \"remove\": remove,\n    // \"filter\": filter,\n    \"untilAll\": untilAll,\n    \"nextAll\": nextAll,\n    \"prevAll\": prevAll,\n    \"showError\": showError\n};"
  },
  {
    "path": "src/js/common/utilsFP.js",
    "content": "import * as utils from './utils.js';\nimport { getContainer, getOptions } from './options.js';\nimport { \n    SLIDE_ACTIVE_SEL, \n    WRAPPER_SEL, \n    SLIDES_WRAPPER,\n    NO_TRANSITION,\n    SECTION_SEL\n} from './selectors.js';\nimport { doc } from './constants.js';\n/**\n* Gets the active slide (or section) for the given section\n*/\nexport function getSlideOrSection(destiny){\n    var slide = utils.$(SLIDE_ACTIVE_SEL, destiny);\n    if( slide.length ) {\n        destiny = slide[0];\n    }\n\n    return destiny;\n}\n\nexport function getSlideOrSectionPanel(panel){\n    if(!panel){\n        return null;\n    }\n    return panel.activeSlide ? panel.activeSlide : panel;\n}\n\nexport function isFullPageAbove(){\n    return getContainer().getBoundingClientRect().bottom >= 0;\n}\n\n/**\n* Gets the scrolling settings depending on the plugin autoScrolling option\n*/\nexport function getScrollSettings(top){\n    var options = getOptions();\n    var position;\n    var element;\n\n    //top property animation\n    if(options.autoScrolling && !options.scrollBar){\n        position = -top;\n        element = utils.$(WRAPPER_SEL)[0];\n    }\n\n    //window real scrolling\n    else{\n        position = top;\n        element = window;\n    }\n\n    return {\n        options: position,\n        element: element\n    };\n}\n\n/**\n* Scrolls the page / slider the given number of pixels.\n* It will do it one or another way dependiong on the library's config.\n*/\nexport function setScrolling(element, val){\n    if(!getOptions().autoScrolling || getOptions().scrollBar || (element.self != window && utils.hasClass(element, SLIDES_WRAPPER))){\n\n        //scrolling horizontally through the slides?\n        if(element.self != window  && utils.hasClass(element, SLIDES_WRAPPER)){\n            element.scrollLeft = val;\n        }\n        //vertical scroll\n        else{   \n            element.scrollTo(0, val);\n        }\n    }else{\n         element.style.top = val + 'px';\n    }\n}\n\n/**\n* Adds transition animations for the given element\n*/\nexport function addAnimation(element){\n    var transition = 'transform ' + getOptions().scrollingSpeed + 'ms ' + getOptions().easingcss3;\n\n    utils.removeClass(element, NO_TRANSITION);\n    return utils.css(element, {\n        '-webkit-transition': transition,\n        'transition': transition\n    });\n}\n\n/**\n* Retuns `up` or `down` depending on the scrolling movement to reach its destination\n* from the current section.\n*/\nexport function getYmovement(activeSection, destiny){\n    var fromIndex = activeSection.index();\n    var toIndex = utils.index(destiny, SECTION_SEL);\n    if( fromIndex == toIndex){\n        return 'none';\n    }\n    if(fromIndex > toIndex){\n        return 'up';\n    }\n    return 'down';\n}\n\n/**\n* Remove transition animations for the given element\n*/\nexport function removeAnimation(element){\n    return utils.addClass(element, NO_TRANSITION);\n}\n\n/**\n* Returns the cross-browser transform string.\n*/\nexport function getTransforms(translate3d){\n    return {\n        '-webkit-transform': translate3d,\n        '-moz-transform': translate3d,\n        '-ms-transform':translate3d,\n        'transform': translate3d\n    };\n}"
  },
  {
    "path": "src/js/console.js",
    "content": "import * as utils from './common/utils.js';\nimport { getOptions } from './common/options.js';\nimport { doc, extensions } from './common/constants.js';\nimport { $html } from './common/cache.js';\nimport {\n    ENABLED\n} from './common/selectors.js';\nimport { state } from './common/state.js';\n\nconst isOK = function(){\n    return getOptions() && state.isValid || doc.domain.indexOf('al'+'varotri' +'go' + '.' + 'com') > -1;\n};\n\n/**\n* Displays warnings\n*/\nexport function displayWarnings(){\n    var l = getOptions()['li' + 'c' + 'enseK' + 'e' + 'y'];\n    var msgStyle = 'font-size: 15px;background:yellow;';\n\n    if(getOptions().licenseKey.trim() === ''){\n        utils.showError('error', 'Fullpage.js requires a `licenseKey` option. Read about it on the following website:');\n        utils.showError('error', 'https://alvarotrigo.com/fullPage/docs/#licensekey');\n    }\n    else if(!isOK()){\n        utils.showError('error', 'Incorrect `licenseKey`. Get one for fullPage.js version 4 here:');\n        utils.showError('error', 'https://alvarotrigo.com/fullPage/pricing');\n    }\n    else if(l && l.length < 20){\n        console.warn('%c This website was made using fullPage.js slider. Learn more on the following website:', msgStyle);\n        console.warn('%c https://alvarotrigo.com/fullPage/', msgStyle);\n    }\n\n    if(utils.hasClass($html, ENABLED)){\n        utils.showError('error', 'Fullpage.js can only be initialized once and you are doing it multiple times!');\n        return;\n    }\n\n    // Disable mutually exclusive settings\n    if (getOptions().continuousVertical &&\n        (getOptions().loopTop || getOptions().loopBottom)) {\n        getOptions().continuousVertical = false;\n        utils.showError('warn', 'Option `loopTop/loopBottom` is mutually exclusive with `continuousVertical`; `continuousVertical` disabled');\n    }\n\n    if(getOptions().scrollOverflow &&\n        (getOptions().scrollBar || !getOptions().autoScrolling)){\n        utils.showError('warn', 'Options scrollBar:true and autoScrolling:false are mutually exclusive with scrollOverflow:true. Sections with scrollOverflow might not work well in Firefox');\n    }\n\n    if(getOptions().continuousVertical && (getOptions().scrollBar || !getOptions().autoScrolling)){\n        getOptions().continuousVertical = false;\n        utils.showError('warn', 'Scroll bars (`scrollBar:true` or `autoScrolling:false`) are mutually exclusive with `continuousVertical`; `continuousVertical` disabled');\n    }\n\n    //using extensions? Wrong file!\n    extensions.forEach(function(extension){\n        //is the option set to true?\n        if(getOptions()[extension]){\n            utils.showError('warn', 'fullpage.js extensions require fullpage.extensions.min.js file instead of the usual fullpage.js. Requested: '+ extension);\n        }\n    });\n\n    //anchors can not have the same value as any element ID or NAME\n    getOptions().anchors.forEach(function(name){\n\n        //case insensitive selectors (http://stackoverflow.com/a/19465187/1081396)\n        var nameAttr = [].slice.call(utils.$('[name]')).filter(function(item) {\n            return utils.getAttr(item, 'name') && utils.getAttr(item, 'name').toLowerCase() == name.toLowerCase();\n        });\n\n        var idAttr = [].slice.call(utils.$('[id]')).filter(function(item) {\n            return utils.getAttr(item, 'id') && utils.getAttr(item, 'id').toLowerCase() == name.toLowerCase();\n        });\n\n        if(idAttr.length || nameAttr.length ){\n            utils.showError('error', 'data-anchor tags can not have the same value as any `id` element on the site (or `name` element for IE).');\n            var propertyName = idAttr.length ? 'id' : 'name';\n\n            if(idAttr.length || nameAttr.length){\n                utils.showError('error', '\"' + name + '\" is is being used by another element `'+ propertyName +'` property');\n            }\n        }\n    });\n}\n\n\n"
  },
  {
    "path": "src/js/dom/addInternalSelectors.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions, getContainer } from '../common/options.js';\nimport { \n    SECTION,\n    SLIDE,\n} from '../common/selectors.js';\n\n/**\n* Adds internal classes to be able to provide customizable selectors\n* keeping the link with the style sheet.\n*/\nexport function addInternalSelectors(){\n    utils.addClass(utils.$(getOptions().sectionSelector, getContainer()), SECTION);\n    utils.addClass(utils.$(getOptions().slideSelector, getContainer()), SLIDE);\n}"
  },
  {
    "path": "src/js/dom/afterRenderActions.js",
    "content": "import * as utils from '../common/utils.js';\nimport { FP } from '../common/constants.js';\nimport { getState, state } from '../common/state.js';\nimport { getOptions} from '../common/options.js';\nimport { playMedia } from '../media.js';\nimport { fireCallback } from '../callbacks/fireCallback.js';\nimport { lazyLoadPanels } from '../lazyLoad/lazyLoad.js';\nimport { lazyLoadOthers } from '../lazyLoad/lazyLoadOthers.js';\nimport { \n    COMPLETELY,\n} from '../common/selectors.js';\nimport { getAnchorsURL } from '../anchors/getAnchorsURL.js';\nimport { getStartingSection } from '../sections.js';\nimport { getSectionByAnchor } from '../common/getSectionByAnchor.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { events } from '../common/events.js';\n\nFP.shared.afterRenderActions = afterRenderActions;\n\n/**\n* Actions and callbacks to fire afterRender\n*/\nexport function afterRenderActions(){\n    var section = getState().activeSection;\n    var sectionElem = getState().activeSection.item;\n\n    utils.addClass(sectionElem, COMPLETELY);\n\n    lazyLoadPanels(getState().activeSection);\n    lazyLoadOthers();\n    playMedia(sectionElem);\n\n    if(isDestinyTheStartingSection() && utils.isFunction(getOptions().afterLoad) ){\n        fireCallback('afterLoad', {\n            activeSection: sectionElem,\n            element: sectionElem,\n            direction: null,\n\n            //for backwards compatibility callback (to be removed in a future!)\n            anchorLink: section.anchor,\n            sectionIndex: section.index(),\n\n            items: {\n                origin: getState().activeSection,\n                destination: getState().activeSection\n            }\n        });\n    }\n\n    if(utils.isFunction(getOptions().afterRender)){\n        fireCallback('afterRender');\n    }\n}\n\n\n/**\n* Determines if the URL anchor destiny is the starting section (the one using 'active' class before initialization)\n*/\nfunction isDestinyTheStartingSection(){\n    var anchor = getAnchorsURL();\n    var destinationSection = getSectionByAnchor(anchor.section);\n    return !anchor.section || !destinationSection || typeof destinationSection !=='undefined' && destinationSection.index() === utils.index(getStartingSection());\n}"
  },
  {
    "path": "src/js/dom/destroyStructure.js",
    "content": "import * as utils from '../common/utils.js';\nimport { removeAnimation } from '../common/utilsFP.js';\nimport { silentScroll } from '../common/silentScroll.js';\nimport { $html, $htmlBody, $body } from '../common/cache.js';\nimport { getState, resetState } from '../common/state.js';\nimport { getOptions, getContainer, getInitialAnchorsInDom } from '../common/options.js';\nimport { getNodes } from '../common/item.js';\nimport { \n    ENABLED,\n    SECTION,\n    SLIDE,\n    COMPLETELY,\n    SLIDES_NAV_SEL,\n    RESPONSIVE,\n    TABLE,\n    ACTIVE,\n    TABLE_CELL_SEL,\n    VIEWING_PREFIX,\n    SECTION_NAV_SEL,\n    SLIDES_CONTAINER,\n    SLIDES_CONTAINER_SEL,\n    SLIDES_WRAPPER_SEL,\n    SLIDES_ARROW_SEL,\n    IS_OVERFLOW,\n    SCROLLABLE,\n    WRAPPER,\n    WATERMARK_SEL,\n    LOADED\n} from '../common/selectors.js';\nimport { win } from '../common/constants.js';\nimport { scrollOverflowHandler } from '../scrolloverflow.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { events } from '../common/events.js';\n\n/*\n* Removes inline styles added by fullpage.js\n*/\nexport function destroyStructure(){\n    //reseting the `top` or `translate` properties to 0\n    silentScroll(0);\n\n    //loading all the lazy load content\n    utils.$('img[data-src], source[data-src], audio[data-src], iframe[data-src]', getContainer()).forEach(function(item){\n        utils.setSrc(item, 'src');\n    });\n\n    utils.$('img[data-srcset]').forEach(function(item){\n        utils.setSrc(item, 'srcset');\n    });\n\n    utils.remove(utils.$(SECTION_NAV_SEL + ', ' + SLIDES_NAV_SEL +  ', ' + SLIDES_ARROW_SEL + ', ' + WATERMARK_SEL));\n\n    //removing inline styles\n    utils.css(getNodes(getState().sections), {\n        'height': '',\n        'background-color' : '',\n        'padding': ''\n    });\n\n    utils.css(getNodes(getState().slides), {\n        'width': ''\n    });\n\n    utils.css(getContainer(), {\n        'height': '',\n        'position': '',\n        '-ms-touch-action': '',\n        'touch-action': ''\n    });\n\n    utils.css($htmlBody, {\n        'overflow': '',\n        'height': ''\n    });\n\n    // remove .fp-enabled class\n    utils.removeClass($html, ENABLED);\n\n    // remove .fp-responsive class & .fp-scrollable\n    utils.removeClass($body, RESPONSIVE + ' ' + SCROLLABLE);\n\n    // remove all of the .fp-viewing- classes\n    $body.className.split(/\\s+/).forEach(function (className) {\n        if (className.indexOf(VIEWING_PREFIX) === 0) {\n            utils.removeClass($body, className);\n        }\n    });\n\n    if(getOptions().scrollOverflow){\n        getState().panels.forEach(function(panel){\n            scrollOverflowHandler.destroyScrollable(panel);\n        });\n    }\n\n    //removing added classes\n    getNodes(getState().panels).forEach(function(item){\n        utils.removeClass(item, TABLE + ' ' + ACTIVE + ' ' + COMPLETELY + ' ' + IS_OVERFLOW + ' ' + LOADED);\n        var previousStyles = utils.getAttr(item, 'data-fp-styles');\n        if(previousStyles){\n            item.setAttribute('style', previousStyles);\n        }\n\n        //removing anchors if they were not set using the HTML markup\n        if(utils.hasClass(item, SECTION) && !getInitialAnchorsInDom()){\n            item.removeAttribute('data-anchor');\n        }\n    });\n\n    //removing the applied transition from the fullpage wrapper\n    removeAnimation(getContainer());\n\n    //Unwrapping content\n    [TABLE_CELL_SEL, SLIDES_CONTAINER_SEL,SLIDES_WRAPPER_SEL].forEach(function(selector){\n        utils.$(selector, getContainer()).forEach(function(item){\n            //unwrap not being use in case there's no child element inside and its just text\n            utils.unwrap(item);\n        });\n    });\n\n    //removing the applied transition from the fullpage wrapper\n    utils.css(getContainer(), {\n        '-webkit-transition': 'none',\n        'transition': 'none'\n    });\n\n    utils.removeClass(getContainer(), WRAPPER);\n\n    //scrolling the page to the top with no animation\n    win.scrollTo(0, 0);\n\n    //removing selectors\n    var usedSelectors = [SECTION, SLIDE, SLIDES_CONTAINER];\n    usedSelectors.forEach(function(item){\n        utils.removeClass(utils.$('.' + item), item);\n    });\n\n    resetState();\n\n    EventEmitter.emit(events.onDestroyAll);\n}"
  },
  {
    "path": "src/js/dom/prepareDom.js",
    "content": "import * as utils from '../common/utils.js';\nimport { $html, $body } from '../common/cache.js';\nimport { addTableClass } from '../common/addTableClass.js';\nimport { getState, setState } from '../common/state.js';\nimport { getOptions, getContainer } from '../common/options.js';\nimport { styleSection } from '../sections.js';\nimport { styleSlides } from '../slides/styleSlides.js';\nimport { styleMenu } from '../menu/styleMenu.js';\nimport { addVerticalNavigation } from '../nav/sections.js';\nimport { enableYoutubeAPI } from '../media.js';\nimport { \n    WRAPPER,\n    ENABLED,\n    DESTROYED\n} from '../common/selectors.js';\nimport { addInternalSelectors } from './addInternalSelectors.js';\nimport { scrollOverflowHandler } from '../scrolloverflow.js';\n\n/**\n* Works over the DOM structure to set it up for the current fullpage getOptions().\n*/\nexport function prepareDom(){\n    \n    utils.css(utils.getParentsUntil(getContainer(), 'body'), {\n        'height': '100%',\n        'position': 'relative'\n    });\n\n    //adding a class to recognize the container internally in the code\n    utils.addClass(getContainer(), WRAPPER);\n    utils.addClass($html, ENABLED);\n\n    //due to https://github.com/alvarotrigo/fullPage.js/issues/1502\n    setState({windowsHeight: utils.getWindowHeight()});\n\n    utils.removeClass(getContainer(), DESTROYED); //in case it was destroyed before initializing it again\n\n    addInternalSelectors();\n\n    var sections = getState().sectionsIncludingHidden;\n\n    //styling the sections / slides / menu\n    for(var i = 0; i<sections.length; i++){\n        var sectionIndex = i;\n        var section = sections[i];\n        var slides = section.allSlidesItems;\n\n        //caching the original styles to add them back on destroy('all')\n        var originalStyles = utils.getAttr(section.item, 'style');\n        if(originalStyles){\n            section.item.setAttribute('data-fp-styles', originalStyles);\n        }\n\n        styleSection(section);\n        styleMenu(section);\n\n        // if there's any slide\n        if (slides.length > 0) {\n            styleSlides(section);\n        }\n    }\n\n    //fixed elements need to be moved out of the plugin container due to problems with CSS3.\n    if(getOptions().fixedElements && getOptions().css3){\n        utils.$(getOptions().fixedElements).forEach(function(item){\n            $body.appendChild(item);\n        });\n    }\n\n    //vertical centered of the navigation + active bullet\n    if(getOptions().navigation){\n        addVerticalNavigation();\n    }\n\n    enableYoutubeAPI();\n\n    if(getOptions().scrollOverflow){\n        scrollOverflowHandler.makeScrollable();\n    }\n}\n"
  },
  {
    "path": "src/js/dynamic.js",
    "content": "import * as utils from './common/utils.js';\nimport { getContainer, getOptions, setOptionsFromDOM } from './common/options.js';\nimport { getState, state } from './common/state.js';\nimport { updateState, updateStructuralState } from './stateUpdates.js';\nimport { addInternalSelectors } from './dom/addInternalSelectors.js';\nimport { addVerticalNavigation } from './nav/sections.js';\nimport { styleSlides } from './slides/styleSlides.js';\nimport { \n    SECTION_NAV_SEL, \n    SLIDES_NAV_SEL,\n    WRAPPER_SEL,\n    SLIDES_ARROW_SEL\n} from './common/selectors.js';\nimport { EventEmitter } from './common/eventEmitter.js';\nimport { FP } from './common/constants.js';\nimport { styleSection } from './sections.js';\nimport { events } from './common/events.js';\nimport { scrollOverflowHandler } from './scrolloverflow.js';\n\nlet g_wrapperObserver;\nconst g_wrapperObserveConfig = {\n    attributes: false,\n    subtree:true,\n    childList: true,\n    characterData: true\n};\n\nEventEmitter.on(events.bindEvents, bindEvents);\nEventEmitter.on(events.onDestroy, unbindEvents);\n\nFP[\"render\"] = onContentChange;\n\nfunction bindEvents(){    \n    if(getOptions().observer && \n        \"MutationObserver\" in window &&\n        utils.$(WRAPPER_SEL)[0]){\n        g_wrapperObserver = createObserver(utils.$(WRAPPER_SEL)[0], onContentChange, g_wrapperObserveConfig);\n    }\n    EventEmitter.on(events.contentChanged, onContentChange);\n}\n\nfunction unbindEvents(){\n    if(g_wrapperObserver){\n        g_wrapperObserver.disconnect();\n        g_wrapperObserver = null;\n    }\n}\n\n/**\n * Creates a Mutation observer.\n */\nfunction createObserver(target, callback, config) {\n    var observer = new MutationObserver(callback);\n    observer.observe(target, config);\n    return observer;\n}\n\nfunction didSlidesChange(){\n    return utils.getVisible(utils.$(getOptions().slideSelector, getContainer())).length !== getState().numSlides;\n}\n\nfunction didSectionsChange(){\n    return utils.getVisible(utils.$(getOptions().sectionSelector, getContainer())).length !== getState().numSections;\n}\n\nfunction didSectionsOrSlidesChange(){\n    return didSlidesChange() || didSectionsChange();\n}\n\n/**\n * Listen to changes on sections and fires reBuild\n * when those changes affect the section height.\n */\nfunction onContentChange(mutations){\n    var _didSlidesChange = didSlidesChange();\n\n    if( didSectionsOrSlidesChange() && !state.isDoingContinousVertical){\n        if(getOptions().observer && g_wrapperObserver){\n            // Temporally disabling the observer while \n            // we modidy the DOM again\n            g_wrapperObserver.disconnect();\n        }\n        updateStructuralState();\n        updateState();\n\n        // Removing navs and anchors options\n        getOptions().anchors = [];\n        utils.remove(utils.$(SECTION_NAV_SEL));\n\n        addInternalSelectors();\n        setOptionsFromDOM();\n\n        if(getOptions().navigation){\n            addVerticalNavigation();\n        }\n        \n        if(getOptions().scrollOverflow){\n            scrollOverflowHandler.makeScrollable();\n        }\n        \n        if(_didSlidesChange){\n            utils.remove(utils.$(SLIDES_NAV_SEL));\n            utils.remove(utils.$(SLIDES_ARROW_SEL));\n        }\n\n        getState().sections.forEach(function(section){\n            if(section.slides.length){\n                if(_didSlidesChange){\n                    styleSlides(section);\n                }\n            }else{\n                styleSection(section);\n            }\n        });\n    }\n\n    if(getOptions().observer && g_wrapperObserver && utils.$(WRAPPER_SEL)[0]){\n        g_wrapperObserver.observe(utils.$(WRAPPER_SEL)[0], g_wrapperObserveConfig);\n    }\n}"
  },
  {
    "path": "src/js/easing.js",
    "content": "import * as utils from './common/utils.js';\nimport { win } from './common/constants.js';\n\n//easeInOutCubic animation included in the plugin\n// @ts-ignore\nwin.fp_easings = utils.deepExtend(win.fp_easings, {\n    easeInOutCubic: function (t, b, c, d) {\n        if ((t/=d/2) < 1) return c/2*t*t*t + b;return c/2*((t-=2)*t*t + 2) + b;\n    }\n});"
  },
  {
    "path": "src/js/fitToSection.js",
    "content": "import { getOptions, setVariableState } from './common/options.js';\nimport { FP } from './common/constants.js';\nimport { setState, state } from './common/state.js';\nimport { scrollPage } from './scroll/scrollPage.js';\n\nFP.setFitToSection = setFitToSection;\nFP.fitToSection = fitToSection;\n\n/**\n* Sets fitToSection\n*/\nexport function setFitToSection(value, type){\n    setVariableState('fitToSection', value, type);\n}\n\n/**\n* Fits the site to the nearest active section\n*/\nexport function fitToSection(){\n    //checking fitToSection again in case it was set to false before the timeout delay\n    if(state.canScroll && getOptions().fitToSection){\n        //allows to scroll to an active section and\n        //if the section is already active, we prevent firing callbacks\n        setState({isResizing: true});\n\n        scrollPage(state.activeSection);\n        setState({isResizing: false});\n    }\n}"
  },
  {
    "path": "src/js/fullpage.js",
    "content": "import './bindings.js';\nimport './dynamic.js';\nimport './normalScrollElements.js';\nimport './resize.js';\nimport './anchors/index.js';\nimport './beyondFullpage/index.js';\nimport './common/scrollTo.js';\nimport './keyboard/index.js';\nimport './menu/index.js';\nimport './nav/index.js';\nimport './scroll/index.js';\nimport './slides/index.js';\nimport './mixed/waterMark.js';\nimport './mixed/index.min.js';\nimport './scroll/skipIntermediateItems.js';\n\nimport * as utils from './common/utils.js';\nimport { setOptions, setOption, getOptions } from './common/options.js';\nimport { setContainer, getContainer } from './common/options.js';\nimport { init } from './instance.js';\nimport { FP, win } from './common/constants.js';\nimport { $html, setCache } from './common/cache.js';\nimport { displayWarnings } from './console.js';\nimport { ENABLED } from './common/selectors.js';\nimport { EventEmitter } from './common/eventEmitter.js';\nimport { events } from './common/events.js';\nimport { setState } from './common/state.js';\n\nexport default function fullpage(containerSelector, options) {\n    setCache();\n\n    //only once my friend!\n    if(utils.hasClass($html, ENABLED)){ displayWarnings(); return; }\n\n    setOption('touchWrapper', typeof containerSelector === 'string' ? utils.$(containerSelector)[0] : containerSelector);\n\n    // Creating some defaults, extending them with any options that were provided\n    setOptions(options);\n\n    setContainer(typeof containerSelector === 'string' ? utils.$(containerSelector)[0] : containerSelector);\n\n    EventEmitter.emit(events.onInitialise);\n\n    displayWarnings();\n\n    setAPI();\n\n    if(getContainer()){\n        EventEmitter.emit(events.beforeInit);\n        init();\n        EventEmitter.emit(events.bindEvents);\n    }\n\n    setState({isFullpageInitDone: true});\n\n    // @ts-ignore\n    return win.fullpage_api;\n}\n\nfunction setAPI(){\n    FP.getFullpageData = function(){ \n        return {\n            options: getOptions()\n        };\n    };\n\n    //public functions\n    FP.version = '4.0.41';\n\n    FP.test = Object.assign(FP.test, {\n        top: '0px',\n        translate3d: 'translate3d(0px, 0px, 0px)',\n        translate3dH: (function(){\n            var a = [];\n            for(var i = 0; i < utils.$(getOptions().sectionSelector, getContainer()).length; i++){\n                a.push('translate3d(0px, 0px, 0px)');\n            }\n            return a;\n        })(),\n        left: (function(){\n            var a = [];\n            for(var i = 0; i < utils.$(getOptions().sectionSelector, getContainer()).length; i++){\n                a.push(0);\n            }\n            return a;\n        })(),\n        options: getOptions(),\n        setAutoScrolling: null\n    });\n\n    //functions we want to share across files but which are not\n    //mean to be used on their own by developers\n    FP.shared = Object.assign(FP.shared, {\n        afterRenderActions: null,\n        isNormalScrollElement: false\n    });\n\n    // @ts-ignore\n    win.fullpage_api = FP;\n}"
  },
  {
    "path": "src/js/infiniteScroll/createInfiniteSections.js",
    "content": "//@ts-check\nimport * as utils from '../common/utils.js';\nimport { silentScroll } from '../common/silentScroll.js';\nimport { getState, setState } from '../common/state.js';\nimport { silentLandscapeScroll } from '../slides/silentLandscapeScroll.js';\nimport {\n    SECTION_SEL,\n    SLIDE_ACTIVE_SEL\n} from '../common/selectors.js';\nimport { getYmovement } from '../common/utilsFP.js';\nimport { getDestinationPosForInfiniteScroll, getTmpPosition } from './getPositions.js';\n\n/**\n* Adds sections before or after the current one to create the infinite effect.\n*/\nexport function createInfiniteSections(v){\n    setState({isDoingContinousVertical: true});\n    var activeSectionItem = getState().activeSection.item;\n    \n    // Scrolling down\n    if (!v.isMovementUp) {\n        // Move all previous sections to after the active section\n        var prevSectionsReversed = utils.prevAll(activeSectionItem, SECTION_SEL).reverse();\n        utils.after(activeSectionItem, prevSectionsReversed[0]);\n    }\n    else { // Scrolling up\n        // Move all next sections to before the active section\n        utils.before(activeSectionItem, utils.nextAll(activeSectionItem, SECTION_SEL));\n    }\n\n    // Maintain the displayed position (now that we changed the element order)\n    silentScroll(getTmpPosition(v));\n\n    // Maintain the active slides visible in the viewport\n    keepSlidesPosition();\n\n    // save for later the elements that still need to be reordered\n    v.wrapAroundElements = activeSectionItem;\n\n    // Recalculate animation variables\n    v.dtop = getDestinationPosForInfiniteScroll(v);\n    v.yMovement = getYmovement(getState().activeSection, v.element);\n\n    return v;\n}\n\n/**\n* Maintains the active slides in the viewport\n* (Because the `scroll` animation might get lost with some actions, such as when using continuousVertical)\n*/\nfunction keepSlidesPosition(){\n    var activeSlides = utils.$(SLIDE_ACTIVE_SEL);\n    for( var i =0; i<activeSlides.length; i++){\n        silentLandscapeScroll(activeSlides[i], 'internal');\n    }\n}\n\n"
  },
  {
    "path": "src/js/infiniteScroll/fixPosition.js",
    "content": "//@ts-check\nimport * as utils from '../common/utils.js';\nimport { silentScroll } from '../common/silentScroll.js';\nimport { getState, setState } from '../common/state.js';\nimport { silentLandscapeScroll } from '../slides/silentLandscapeScroll.js';\nimport {\n    SECTION_SEL,\n    SLIDE_ACTIVE_SEL\n} from '../common/selectors.js';\nimport { getTmpPosition } from './getPositions.js';\n\n/**\n* Maintains the active slides in the viewport\n* (Because the `scroll` animation might get lost with some actions, such as when using continuousVertical)\n*/\nfunction keepSlidesPosition(){\n    var activeSlides = utils.$(SLIDE_ACTIVE_SEL);\n    for( var i =0; i<activeSlides.length; i++){\n        silentLandscapeScroll(activeSlides[i], 'internal');\n    }\n}\n\n/**\n* Fix section order after continuousVertical changes have been animated\n*/\nexport function continuousVerticalFixSectionOrder (v) {\n    // If continuousVertical is in effect (and autoScrolling would also be in effect then),\n    // finish moving the elements around so the direct navigation will function more simply\n    if (v.wrapAroundElements == null) {\n        return;\n    }\n\n    if (v.isMovementUp) {\n        utils.before(utils.$(SECTION_SEL)[0], v.wrapAroundElements);\n    }\n    else {\n        utils.after(utils.$(SECTION_SEL)[getState().sections.length - 1], utils.prevAll(v.element, SECTION_SEL).reverse());\n    }\n\n    silentScroll(getTmpPosition(v));\n\n    // Maintain the active slides visible in the viewport\n    keepSlidesPosition();\n\n    setState({isDoingContinousVertical: false});\n}"
  },
  {
    "path": "src/js/infiniteScroll/getPositions.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getState } from \"../common/state.js\";\nimport { getDestinationPosition } from \"../scroll/scrollPage.js\";\nimport { AUTO_HEIGHT } from '../common/selectors.js';\n\nexport function getTmpPosition(v){\n    return utils.hasClass(getState().activeSection.item, AUTO_HEIGHT) \n        ? getDestinationPosition(getState().activeSection.item) \n        : getState().activeSection.item.offsetTop;\n}\n\nexport function getDestinationPosForInfiniteScroll(v){\n    // forcing the scroll to the bottom of the fp-auto-height section when scrolling up\n    if(v.isMovementUp && utils.hasClass(v.element, AUTO_HEIGHT)){\n        return getDestinationPosition(v.element) - utils.getWindowHeight() + v.element.offsetHeight;\n    }\n    \n    return v.element.offsetTop;\n}\n"
  },
  {
    "path": "src/js/instance.js",
    "content": "import * as utils from './common/utils.js';\nimport { getOptions, getContainer, setOptionsFromDOM } from './common/options.js';\nimport { updateState, updateStructuralState } from './stateUpdates.js';\nimport { setAutoScrolling } from './autoScrolling.js';\nimport { setMouseHijack } from './mouse/wheel.js';\nimport { responsive } from './responsive.js';\nimport { setBodyClass } from './stateClasses.js';\nimport { setKeyboardScrolling } from './keyboard/setKeyboardScrolling.js';\nimport { DESTROYED } from './common/selectors.js';\nimport { doc, FP } from './common/constants.js';\nimport { EventEmitter } from './common/eventEmitter.js';\nimport { prepareDom } from './dom/prepareDom.js';\nimport { afterRenderActions } from './dom/afterRenderActions.js';\nimport { setAllowScrolling } from './scroll/setAllowScrolling.js';\nimport { scrollToAnchor } from './scroll/scrollToAnchor.js';\nimport { destroyStructure } from './dom/destroyStructure.js';\nimport { events } from './common/events.js';\n\nFP.destroy = destroy;\n\nexport function init(){\n    updateStructuralState();\n    updateState();\n\n    getOptions().scrollBar = getOptions().scrollBar || getOptions().hybrid;\n\n    setOptionsFromDOM();\n    prepareDom();\n    setAllowScrolling(true);\n    setMouseHijack(true);\n    setAutoScrolling(getOptions().autoScrolling, 'internal');\n    responsive();\n    \n    //setting the class for the body element\n    setBodyClass();\n\n    if (document.readyState !== 'loading') {\n        scrollToAnchor();\n    } \n    else{\n        document.addEventListener('DOMContentLoaded', scrollToAnchor);\n    }\n\n    afterRenderActions();\n\n    // Updating the state again with the new DOM\n    updateStructuralState();\n    updateState();\n}\n\n/*\n* Destroys fullpage.js plugin events and optinally its html markup and styles\n*/\nexport function destroy(all){\n    setAutoScrolling(false, 'internal');\n    setAllowScrolling(true);\n    setMouseHijack(false);\n    setKeyboardScrolling(false);\n    utils.addClass(getContainer(), DESTROYED);\n\n    EventEmitter.emit(events.onDestroy);\n\n    //lets make a mess!\n    if(all){\n        destroyStructure();\n    }\n}"
  },
  {
    "path": "src/js/jquery-adaptor.js",
    "content": "import * as utils from './common/utils.js';\nimport { FP, win } from \"./common/constants.js\";\nimport { getOptions } from \"./common/options.js\";\nimport fullpage from './fullpage.js';\n\n/**\n * jQuery adapter for fullPage.js 3.0.0\n */\n// @ts-ignore\nif(win.jQuery){\n    (function ($, fullpage) {\n        'use strict';\n\n        // No jQuery No Go\n        if (!$ || !fullpage) {\n            utils.showError('error', 'jQuery is required to use the jQuery fullpage adapter!');\n            return;\n        }\n\n        $.fn.fullpage = function(options) {\n            options = $.extend({}, options, {'$': $});\n            var instance = new fullpage(this[0], options);\n\n            // Creating the $.fn.fullpage object\n            Object.keys(FP).forEach(function (key) {    \n                getOptions().$.fn.fullpage[key] = FP[key];   \n            });\n        };\n       \n    // @ts-ignore\n    })(win.jQuery, fullpage);\n}"
  },
  {
    "path": "src/js/keyboard/index.js",
    "content": "//@ts-check\nimport * as utils from '../common/utils.js';\nimport { getOptions } from '../common/options';\nimport { focusableElementsString, doc } from '../common/constants.js';\nimport { getSlideOrSection, getSlideOrSectionPanel } from '../common/utilsFP.js';\nimport { getIsScrollAllowed } from '../common/isScrollAllowed.js';\nimport { \n    SECTION_ACTIVE_SEL,\n    SLIDE_ACTIVE_SEL,\n    SLIDE_SEL,\n    SECTION_SEL,\n    OVERFLOW_SEL\n} from '../common/selectors.js';\nimport { getActivePanel, getState, setState, state } from '../common/state.js';\nimport { moveSlideLeft, moveSlideRight } from '../slides/moveSlide.js';\nimport { scrollOverflowHandler } from '../scrolloverflow.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { moveSectionUp } from '../scroll/moveSectionUp.js';\nimport { moveSectionDown } from '../scroll/moveSectionDown.js';\nimport { moveTo } from '../scroll/moveTo.js';\nimport { events } from '../common/events.js';\nimport { isInsideInput } from '../common/utils.js';\n\nlet g_controlPressed;\nlet g_keydownId;\nlet g_elToFocus;\n\nEventEmitter.on(events.bindEvents, bindEvents);\n\nfunction bindEvents(){\n    //when opening a new tab (ctrl + t), `control` won't be pressed when coming back.\n    utils.windowAddEvent('blur', blurHandler);\n\n    //Sliding with arrow keys, both, vertical and horizontal\n    utils.docAddEvent('keydown', keydownHandler);\n\n    //to prevent scrolling while zooming\n    utils.docAddEvent('keyup', keyUpHandler);\n\n    EventEmitter.on(events.onDestroy, onDestroy);\n\n    EventEmitter.on(events.afterSlideLoads, onAfterSlideLoads);\n    EventEmitter.on(events.afterSectionLoads, afterSectionLoads);\n}\n\n\nfunction onDestroy(){\n    clearTimeout(g_keydownId);\n    utils.docRemoveEvent('keydown', keydownHandler);\n    utils.docRemoveEvent('keyup', keyUpHandler);\n}\n\n//Sliding with arrow keys, both, vertical and horizontal\nfunction keydownHandler(e) {\n    clearTimeout(g_keydownId);\n\n    var keyCode = e.keyCode;\n    var isPressingHorizontalArrows = [37,39].indexOf(keyCode) > -1;\n    var canScrollWithKeyboard = getOptions().autoScrolling || getOptions().fitToSection || isPressingHorizontalArrows;\n    \n    //tab?\n    if(keyCode === 9){\n        onTab(e);\n    }\n\n    else if( !isInsideInput() &&\n        getOptions().keyboardScrolling && \n        canScrollWithKeyboard){\n\n        g_controlPressed = e.ctrlKey;\n\n        g_keydownId = setTimeout(function(){\n            onkeydown(e);\n        },0);\n    }\n}\n\n/**\n* Keydown event\n*/\nfunction onkeydown(e){\n    var shiftPressed = e.shiftKey;\n    var activeElement = doc.activeElement;\n    var isMediaFocused = utils.matches(activeElement, 'video') || utils.matches(activeElement, 'audio');\n    var isScrolled = {\n        up: scrollOverflowHandler.isScrolled('up', getState().activeSection.item),\n        down: scrollOverflowHandler.isScrolled('down', getState().activeSection.item)\n    };\n\n    var isUsingHorizontalArrowKeys = [37,39].indexOf(e.keyCode) > -1;\n    \n    cancelDirectionKeyEvents(e);\n    \n    //do nothing if we can not scroll or we are not using horizotnal key arrows.\n    if(!state.canScroll && !isUsingHorizontalArrowKeys){\n        return;\n    }\n\n    setState({scrollTrigger: 'keydown'});\n\n    switch (e.keyCode) {\n        //up\n        case 38:\n        case 33:\n            if(getIsScrollAllowed().k.up && isScrolled.up){\n                if( state.isBeyondFullpage ){\n                    EventEmitter.emit(events.onKeyDown, {e: e});\n                }else{\n                    moveSectionUp();\n                }\n            }\n            else{\n                scrollOverflowHandler.focusScrollable();\n            }\n            break;\n\n        //down\n        case 32: //spacebar\n            if(shiftPressed && getIsScrollAllowed().k.up && !isMediaFocused && isScrolled.up){\n                moveSectionUp();\n                break;\n            }\n        /* falls through */\n        case 40:\n        case 34:\n            if(getIsScrollAllowed().k.down && isScrolled.down){\n                if( state.isBeyondFullpage ){\n                    return;\n                }\n                \n                // space bar?\n                if(e.keyCode !== 32 || !isMediaFocused){\n                    moveSectionDown();\n                }\n            }\n            else{\n                scrollOverflowHandler.focusScrollable();\n            }   \n            break;\n\n        //Home\n        case 36:\n            if(getIsScrollAllowed().k.up){\n                moveTo(1);\n            }\n            break;\n\n        //End\n        case 35:\n             if(getIsScrollAllowed().k.down){\n                moveTo( getState().sections.length );\n            }\n            break;\n\n        //left\n        case 37:\n            if(getIsScrollAllowed().k.left){\n                if(getOptions().rtl){\n                    moveSlideRight();\n                } else {\n                    moveSlideLeft();\n                }\n            }\n            break;\n\n        //right\n        case 39:\n            if(getIsScrollAllowed().k.right){\n                if(getOptions().rtl){\n                    moveSlideLeft();\n                } else {\n                    moveSlideRight();\n                }\n            }\n            break;\n\n        default:\n            return; // exit this handler for other keys\n    }\n}    \n\n\n//to prevent scrolling while zooming\nfunction keyUpHandler(e){\n    if(state.isWindowFocused){ //the keyup gets fired on new tab ctrl + t in Firefox\n        g_controlPressed = e.ctrlKey;\n    }\n}\n\n\n//when opening a new tab (ctrl + t), `control` won't be pressed when coming back.\nfunction blurHandler(){\n    setState({isWindowFocused: false});\n    g_controlPressed = false;\n}\n\n\n/**\n* Makes sure the tab key will only focus elements within the current section/slide\n* preventing this way from breaking the page.\n* Based on \"Modals and keyboard traps\"\n* from https://developers.google.com/web/fundamentals/accessibility/focus/using-tabindex\n*/\nfunction onTab(e){\n    var isShiftPressed = e.shiftKey;\n    var activeElement = doc.activeElement;\n    var focusableElements = getFocusables(getSlideOrSection(getState().activeSection.item));\n\n    function preventAndFocusFirst(e){\n        utils.preventDefault(e);\n        return focusableElements[0] ? focusableElements[0].focus() : null;\n    }\n\n    // deactivating tab while scrolling #4550\n    if(!state.canScroll){\n        utils.preventDefault(e);\n        return;\n    }\n\n    //outside any section or slide? Let's not hijack the tab!\n    if(isFocusOutside(e)){\n        return;\n    }\n\n    //is there an element with focus?\n    if(activeElement){\n        if(utils.closest(activeElement, SECTION_ACTIVE_SEL + ',' + SECTION_ACTIVE_SEL + ' ' + SLIDE_ACTIVE_SEL) == null){\n            activeElement = preventAndFocusFirst(e);\n        }\n    }\n\n    //no element if focused? Let's focus the first one of the section/slide\n    else{\n        preventAndFocusFirst(e);\n    }\n\n    //when reached the first or last focusable element of the section/slide\n    //we prevent the tab action to keep it in the last focusable element\n    const isFirstFocusableInSection = activeElement == focusableElements[0];\n    const isLastFocusableInSection = activeElement == focusableElements[focusableElements.length - 1];\n    const isNextItem = !isShiftPressed && isLastFocusableInSection;\n    const isPrevItem = isShiftPressed && isFirstFocusableInSection;\n\n    if( isPrevItem || isNextItem ){\n        utils.preventDefault(e);\n\n        var focusInfo = getPanelWithFocusable(isPrevItem);\n        var destinationPanel = focusInfo ? focusInfo.panel : null;\n\n        if(destinationPanel){\n            var destinationSection = destinationPanel.isSection ? destinationPanel : destinationPanel.parent;\n\n            EventEmitter.emit(events.onScrollPageAndSlide, {\n                sectionAnchor: destinationSection.index() + 1,\n                slideAnchor: destinationPanel.isSection ? 0 : destinationPanel.index()\n            });\n            g_elToFocus = focusInfo.itemToFocus;\n            utils.preventDefault(e);\n        }\n    }\n}\n\nfunction onAfterSlideLoads(v){\n    focusItem();\n}\n\nfunction afterSectionLoads(v){\n    if(!utils.closest(g_elToFocus, SLIDE_SEL) || utils.closest(g_elToFocus, SLIDE_ACTIVE_SEL)){\n        focusItem();\n    }\n}\n\nfunction focusItem(){\n    if(g_elToFocus){\n        g_elToFocus.focus();\n        g_elToFocus = null;\n    }\n}\n\n/**\n * Get's the panel containing the element to focus.\n *\n */\nfunction getPanelWithFocusable(isPrevItem){\n    var action = isPrevItem ? 'prevPanel' : 'nextPanel';\n    var focusableElements = [];\n    var panelWithFocusables;\n    var currentPanel = getSlideOrSectionPanel(getActivePanel()[action]());\n    \n    do{\n        focusableElements = getFocusables(currentPanel.item);\n\n        if(focusableElements.length){\n            panelWithFocusables = {\n                panel: currentPanel,\n                itemToFocus: focusableElements[isPrevItem ? focusableElements.length -1 : 0]\n            };\n        }\n        currentPanel = getSlideOrSectionPanel(currentPanel[action]());\n\n    }while(currentPanel && focusableElements.length === 0);\n\n    return panelWithFocusables;\n}\n\n\n/**\n* Gets all the focusable elements inside the passed element.\n*/\nfunction getFocusables(el){\n    return [].slice.call(utils.$(focusableElementsString, el)).filter(function(item) {\n            return utils.getAttr(item, 'tabindex') !== '-1' &&\n            //are also not hidden elements (or with hidden parents)\n            item.offsetParent !== null;\n    });\n}\n\n\n/**\n* Determines whether the focus is outside fullpage.js sections/slides or not.\n*/\nfunction isFocusOutside(e){\n    var allFocusables = getFocusables(doc);\n    var currentFocusIndex = allFocusables.indexOf(doc.activeElement);\n    var focusDestinationIndex = e.shiftKey ? currentFocusIndex - 1 : currentFocusIndex + 1;\n    var focusDestination = allFocusables[focusDestinationIndex];\n    var destinationItemSlide = utils.closest(focusDestination, SLIDE_SEL);\n    var destinationItemSection = utils.closest(focusDestination, SECTION_SEL);\n    \n    return !destinationItemSlide && !destinationItemSection;\n}\n\nfunction shouldCancelKeyboardNavigation(e){\n    // https://keycode.info/for/34\n    // 40 = arrow down\n    // 38 = arrow up\n    // 32 = spacebar\n    // 33  = PageUp\n    // 34 = PageDown\n    var keyControls = [40, 38, 32, 33, 34];\n    return keyControls.indexOf(e.keyCode) > -1 && !state.isBeyondFullpage;\n}\n\n//preventing the scroll with arrow keys & spacebar & Page Up & Down keys\nfunction cancelDirectionKeyEvents(e){\n    if(shouldCancelKeyboardNavigation(e) && !utils.closest(e.target, OVERFLOW_SEL)){\n        e.preventDefault();\n    }\n}\n\nexport function getControlPressed(){\n    return g_controlPressed;\n}"
  },
  {
    "path": "src/js/keyboard/setKeyboardScrolling.js",
    "content": "//@ts-check\nimport { getOptions } from '../common/options';\nimport { FP } from '../common/constants.js';\nimport { setIsScrollAllowed } from '../common/isScrollAllowed.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { events } from '../common/events.js';\n\nEventEmitter.on(events.beforeInit, beforeInit);\n\nFP.setKeyboardScrolling = setKeyboardScrolling;\n\nfunction beforeInit(){\n    setKeyboardScrolling(getOptions().keyboardScrolling);\n}\n\n/**\n* Adds or remove the possibility of scrolling through sections by using the keyboard arrow keys\n*/\nexport function setKeyboardScrolling(value, directions){\n    if(typeof directions !== 'undefined'){\n        directions = directions.replace(/ /g,'').split(',');\n\n        directions.forEach(function(direction){\n            setIsScrollAllowed(value, direction, 'k');\n        });\n    }else{\n        setIsScrollAllowed(value, 'all', 'k');\n        getOptions().keyboardScrolling = value;\n    }\n}  "
  },
  {
    "path": "src/js/lazyLoad/lazyLoad.js",
    "content": "import * as utils from '../common/utils.js'; \nimport { getSlideOrSection } from '../common/utilsFP.js';\nimport { getOptions } from '../common/options.js';\nimport { onMediaLoad } from '../media.js'; \nimport { LOADED } from '../common/selectors.js';\n\n/**\n* Lazy loads image, video and audio elements.\n*/\nexport function lazyLoad(destiny){\n    if (!getOptions().lazyLoading){\n        return;\n    }\n\n    var panel = getSlideOrSection(destiny);\n\n    utils.$('img[data-src], img[data-srcset], source[data-src], source[data-srcset], video[data-src], audio[data-src], iframe[data-src]', panel).forEach(function(element){\n        ['src', 'srcset'].forEach(function(type){\n            var attribute = utils.getAttr(element, 'data-' + type);\n            if(attribute != null && attribute){\n                utils.setSrc(element, type);\n                element.addEventListener('load', function(){\n                    onMediaLoad(destiny);\n                });\n            }\n        });\n\n        if(utils.matches(element, 'source')){\n            var elementToPlay =  utils.closest(element, 'video, audio');\n            if(elementToPlay){\n                elementToPlay.load();\n                elementToPlay.onloadeddata = function(){\n                    onMediaLoad(destiny);\n                };\n            }\n        }\n    });\n\n    // Add fp-loaded class to the panel after lazy loading\n    utils.addClass(panel, LOADED);\n}\n\nexport function lazyLoadPanels(panel){\n    var lazyLoadThresold = getOptions().lazyLoadThreshold;\n\n    lazyLoad(panel.item);\n    if(lazyLoadThresold){\n        lazyLoadDirection(panel, 'prev', lazyLoadThresold);\n        lazyLoadDirection(panel, 'next', lazyLoadThresold);\n    }\n}\n\n// Lazy load \"count\" number of panels in a specific direction\nfunction lazyLoadDirection(startPanel, direction, count) {\n    let currentPanel = startPanel;\n    for (let i = 0; i < count && (currentPanel = currentPanel[direction]()); i++) {\n        lazyLoad(currentPanel.item);\n    }\n}"
  },
  {
    "path": "src/js/lazyLoad/lazyLoadOthers.js",
    "content": "import * as utils from '../common/utils.js'; \nimport { getOptions } from '../common/options.js';\nimport { \n    AUTO_HEIGHT_SEL,\n    AUTO_HEIGHT_RESPONSIVE_SEL,\n    SECTION_SEL,\n    ACTIVE_SEL\n} from '../common/selectors.js';\nimport { getState, state } from '../common/state.js';\nimport { isResponsiveMode } from '../responsive.js';\nimport { lazyLoadPanels } from './lazyLoad.js';\nimport { getPanelByElement } from '../common/item.js';\n\n/**\n* Makes sure lazyload is done for other sections in the viewport that are not the\n* active one. \n*/\nexport function lazyLoadOthers(){\n    var hasAutoHeightSections = utils.$(AUTO_HEIGHT_SEL)[0] || isResponsiveMode() && utils.$(AUTO_HEIGHT_RESPONSIVE_SEL)[0];\n\n    //quitting when it doesn't apply\n    if (!getOptions().lazyLoading || !hasAutoHeightSections){\n        return;\n    }\n\n    //making sure to lazy load auto-height sections that are in the viewport\n    utils.$(SECTION_SEL + ':not(' + ACTIVE_SEL + ')').forEach(function(section){\n        if(isSectionInViewport(section)){\n            lazyLoadPanels(getPanelByElement(getState().sections, section));\n        }\n    });\n}\n\n\n/**\n* Determines whether a section is in the viewport or not.\n*/\nfunction isSectionInViewport (el) {\n    var rect = el.getBoundingClientRect();\n    var top = rect.top;\n    var bottom = rect.bottom;\n\n    //sometimes there's a 1px offset on the bottom of the screen even when the \n    //section's height is the window.innerHeight one. I guess because pixels won't allow decimals.\n    //using this prevents from lazyLoading the section that is not yet visible \n    //(only 1 pixel offset is)\n    var pixelOffset = 2;\n    \n    var isTopInView = top + pixelOffset < state.windowsHeight && top > 0;\n    var isBottomInView = bottom > pixelOffset && bottom < state.windowsHeight;\n\n    return isTopInView || isBottomInView;\n}\n"
  },
  {
    "path": "src/js/media.js",
    "content": "import * as utils from './common/utils.js'; \nimport { getSlideOrSection } from './common/utilsFP.js';\nimport { getContainer } from './common/options.js';\n\n// let g_mediaLoadedId;\n\n/**\n* Callback firing when a lazy load media element has loaded.\n* Making sure it only fires one per section in normal conditions (if load time is not huge)\n*/\nexport function onMediaLoad(section){\n// if(getOptions().scrollOverflow){\n//     clearTimeout(g_mediaLoadedId);\n//     g_mediaLoadedId = setTimeout(function(){\n//         if(!utils.hasClass($body, RESPONSIVE)){\n//             scrollBarHandler.createScrollBar(section);\n//         }\n//     }, 200);\n// }\n}\n\nfunction hasAutoPlay(item){\n    return item.hasAttribute('data-autoplay') || item.hasAttribute('autoplay');\n}\n\n/**\n* Plays video and audio elements.\n*/\nexport function playMedia(destiny){\n    var panel = getSlideOrSection(destiny);\n\n    //playing HTML5 media elements\n    utils.$('video, audio', panel).forEach(function(element){\n        if( hasAutoPlay(element) && typeof element.play === 'function' ) {\n            element.play();\n        }\n    });\n\n    //youtube videos\n    utils.$('iframe[src*=\"youtube.com/embed/\"]', panel).forEach(function(element){\n        if ( hasAutoPlay(element) ){\n            playYoutube(element);\n        }\n\n        //in case the URL was not loaded yet. On page load we need time for the new URL (with the API string) to load.\n        element.onload = function() {\n            if ( hasAutoPlay(element) ){\n                playYoutube(element);\n            }\n        };\n    });\n}\n\n/**\n* Plays a youtube video\n*/\nfunction playYoutube(element){\n    element.contentWindow.postMessage('{\"event\":\"command\",\"func\":\"playVideo\",\"args\":\"\"}', '*');\n}\n\n/**\n* Stops video and audio elements.\n*/\nexport function stopMedia(destiny){\n    var panel = getSlideOrSection(destiny);\n\n    //stopping HTML5 media elements\n    utils.$('video, audio', panel).forEach(function(element){\n        if( !element.hasAttribute('data-keepplaying') && typeof element.pause === 'function' ) {\n            element.pause();\n        }\n    });\n\n    //youtube videos\n    utils.$('iframe[src*=\"youtube.com/embed/\"]', panel).forEach(function(element){\n        if( /youtube\\.com\\/embed\\//.test(utils.getAttr(element, 'src')) && !element.hasAttribute('data-keepplaying')){\n            element.contentWindow.postMessage('{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}','*');\n        }\n    });\n}\n\n/*\n* Enables the Youtube videos API so we can control their flow if necessary.\n*/\nexport function enableYoutubeAPI(){\n    utils.$('iframe[src*=\"youtube.com/embed/\"]', getContainer()).forEach(function(item){\n        addURLParam(item, 'enablejsapi=1');\n    });\n}\n\n/**\n* Adds a new parameter and its value to the `src` of a given element\n*/\nfunction addURLParam(element, newParam){\n    var originalSrc = utils.getAttr(element, 'src');\n    element.setAttribute('src', originalSrc + getUrlParamSign(originalSrc) + newParam);\n}\n\n\n/*\n* Returns the prefix sign to use for a new parameter in an existen URL.\n*\n* @return {String}  ? | &\n*/\nfunction getUrlParamSign(url){\n    return ( !/\\?/.test( url ) ) ? '?' : '&';\n}"
  },
  {
    "path": "src/js/menu/activateMenuAndNav.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions } from '../common/options.js';\nimport { activateNavDots } from '../nav/sections.js';\nimport {\n    ACTIVE,\n    ACTIVE_SEL,\n} from '../common/selectors.js';\n\n/**\n* Sets to active the current menu and vertical nav items.\n*/\nexport function activateMenuAndNav(anchor, index){\n    activateMenuElement(anchor);\n    activateNavDots(anchor, index);\n}\n\n/**\n* Activating the website main menu elements according to the given slide name.\n*/\nfunction activateMenuElement(name){\n    if(getOptions().menu && getOptions().menu.length){\n        utils.$(getOptions().menu).forEach(function(menu) {\n            if(menu != null){\n                utils.removeClass(utils.$(ACTIVE_SEL, menu), ACTIVE);\n                utils.addClass(utils.$('[data-menuanchor=\"'+name+'\"]', menu), ACTIVE);\n            }\n        });\n    }\n}"
  },
  {
    "path": "src/js/menu/index.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions } from '../common/options.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { setState } from '../common/state.js';\nimport { events } from '../common/events.js';\nimport { closest } from '../common/utils.js';\n\nEventEmitter.on(events.bindEvents, bindEvents);\n\nfunction bindEvents(){\n    EventEmitter.on(events.onClickOrTouch, onClickOrTouch);\n}\n\nfunction onClickOrTouch(params){\n    var target = params.target;\n    \n    if(utils.closest(target, getOptions().menu + ' [data-menuanchor]')){\n        menuItemsHandler.call(target, params.e);\n    }\n}\n\n\n//Menu item handler when not using anchors or using lockAnchors:true\nfunction menuItemsHandler(e){\n    setState({scrollTrigger: 'menu'});\n\n    if(utils.$(getOptions().menu)[0] && (getOptions().lockAnchors || !getOptions().anchors.length)){\n        utils.preventDefault(e);\n\n        const menuAnchorEl = closest(this, '[data-menuanchor]');\n\n        /*jshint validthis:true */\n        EventEmitter.emit(events.onMenuClick, {\n            anchor: utils.getAttr(menuAnchorEl, 'data-menuanchor')\n        });\n    }\n}\n"
  },
  {
    "path": "src/js/menu/styleMenu.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions } from '../common/options.js';\nimport { $body } from '../common/cache.js';\nimport { WRAPPER_SEL } from '../common/selectors.js';\nimport { activateMenuAndNav } from './activateMenuAndNav.js';\n\n/**\n* Sets the data-anchor attributes to the menu elements and activates the current one.\n*/\nexport function styleMenu(section){\n    var index = section.index();\n\n    if (typeof getOptions().anchors[index] !== 'undefined') {\n        //activating the menu / nav element on load\n        if(section.isActive){\n            activateMenuAndNav(getOptions().anchors[index], index);\n        }\n    }\n\n    //moving the menu outside the main container if it is inside (avoid problems with fixed positions when using CSS3 tranforms)\n    if(getOptions().menu && getOptions().css3 && utils.closest(utils.$(getOptions().menu)[0], WRAPPER_SEL) != null){\n        utils.$(getOptions().menu).forEach(function(menu) {\n            $body.appendChild(menu);\n        });\n    }\n}"
  },
  {
    "path": "src/js/mixed/warnings.js",
    "content": "import { doc } from '../common/constants.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { events } from '../common/events.js';\nimport { state } from '../common/state.js';\n\nEventEmitter.on(events.bindEvents, showLicenseWarning);\n\nfunction showLicenseWarning(){\n    const waterMark = `\n        <div class=\"fp-warning\" style=\"left: 0;\">\n            The license key for fullPage.js is missing or is not valid. \n            <a href=\"https://alvarotrigo.com/fullPage/\" \n                rel=\"nofollow noopener\" \n                target=\"_blank\" \n                style=\"text-decoration:underline; color: #104acc;\">\n                    Read More here.\n            </a>\n        </div>\n    `;\n    if(!state.isValid){\n        doc.body.insertAdjacentHTML('beforeend', waterMark);\n    }\n}"
  },
  {
    "path": "src/js/mixed/waterMark.js",
    "content": "import { EventEmitter } from '../common/eventEmitter.js';\nimport { events } from '../common/events.js';\nimport { getOptions } from '../common/options.js';\nimport { state } from '../common/state.js';\nimport { getLast } from '../common/utils.js';\nimport { WATERMARK } from '../common/selectors.js';\n\nEventEmitter.on(events.bindEvents, init);\n\nfunction init(){\n    const position = getOptions().credits.position || 'right';\n    const positionStyle = ['left', 'right'].indexOf(position) > -1 ? `${position}: 0;` : '';\n    const waterMark = `\n        <div class=\"${WATERMARK}\" style=\"${positionStyle}\">\n            <a href=\"https://alvarotrigo.com/fullPage/\" \n                rel=\"nofollow noopener\" \n                target=\"_blank\" \n                style=\"text-decoration:none; color: #000;\">\n                    ${getOptions().credits.label || 'Made with fullPage.js'}\n            </a>\n        </div>\n    `;\n    const lastSection = getLast(state.sections);\n    const shouldUseWaterMark =  !state.isValid || getOptions().credits.enabled;\n\n    if(lastSection && lastSection.item && shouldUseWaterMark){\n        lastSection.item.insertAdjacentHTML('beforeend', waterMark);\n    }\n}"
  },
  {
    "path": "src/js/mouse/move.js",
    "content": "import { getIsScrollAllowed } from '../common/isScrollAllowed.js';\nimport { getOptions } from '../common/options.js';\nimport { moveSectionDown } from '../scroll/moveSectionDown.js';\nimport { moveSectionUp } from '../scroll/moveSectionUp.js';\nimport { state } from '../common/state.js';\n\nlet oldPageY = 0;\n\n/**\n* Detecting the direction of the mouse movement.\n* Used only for the middle button of the mouse.\n*/\nexport function mouseMoveHandler(e) {\n    if (!getOptions().autoScrolling) {\n        return;\n    }\n    if (state.canScroll) {\n        // moving up\n        if (e.pageY < oldPageY && getIsScrollAllowed().m.up) {\n            moveSectionUp();\n        }\n\n        // moving down\n        else if (e.pageY > oldPageY && getIsScrollAllowed().m.down) {\n            moveSectionDown();\n        }\n    }\n    oldPageY = e.pageY;\n}\n\nexport function setOldPageY(value){\n    oldPageY = value;\n}"
  },
  {
    "path": "src/js/mouse/wheel.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getIsScrollAllowed } from '../common/isScrollAllowed.js';\nimport { getPassiveOptionsIfPossible } from '../common/supportsPassive.js';\nimport { getOptions, getContainer } from '../common/options.js';\nimport { beyondFullPageHandler } from '../beyondFullpage/beyondFullPageHandler.js';\nimport { state, setState } from '../common/state.js';\nimport { setOldPageY, mouseMoveHandler } from '../mouse/move.js';\nimport { addTouchHandler, removeTouchHandler } from '../touch';\nimport { scrolling } from '../scroll/scrolling.js';\nimport { moveSlideLeft, moveSlideRight } from '../slides/moveSlide.js';\nimport { getControlPressed } from '../keyboard/index.js';\nimport { doc, FP, win } from '../common/constants.js';\nimport {\n    COMPLETELY_SEL,\n    NORMAL_SCROLL\n} from '../common/selectors.js';\n\nlet prevTime = new Date().getTime();\nlet prevHorizontalTime = new Date().getTime();\nlet scrollings = [];\nlet horizontalScrollings = [];\n\nFP.setMouseWheelScrolling = setMouseWheelScrolling;\n\n/**\n* Adds or remove the possibility of scrolling through sections by using the mouse wheel or the trackpad.\n*/\nfunction setMouseWheelScrolling(value){\n    if(value){\n        addMouseWheelHandler();\n        addMiddleWheelHandler();\n    }else{\n        removeMouseWheelHandler();\n        removeMiddleWheelHandler();\n    }\n}\n\n/**\n* Adds the auto scrolling action for the mouse wheel and trackpad.\n* After this function is called, the mousewheel and trackpad movements will scroll through sections\n* https://developer.mozilla.org/en-US/docs/Web/Events/wheel\n*/\nfunction addMouseWheelHandler(){\n    var prefix = '';\n    var _addEventListener;\n\n    if (win.addEventListener){\n        _addEventListener = \"addEventListener\";\n    }else{\n        _addEventListener = \"attachEvent\";\n        prefix = 'on';\n    }\n\n    // detect available wheel event\n    var support = 'onwheel' in doc.createElement('div') ? 'wheel' : // Modern browsers support \"wheel\"\n                // @ts-ignore\n                doc.onmousewheel !== undefined ? 'mousewheel' : // Webkit and IE support at least \"mousewheel\"\n                'DOMMouseScroll'; // let's assume that remaining browsers are older Firefox\n    var passiveEvent = getPassiveOptionsIfPossible();\n\n    if(support == 'DOMMouseScroll'){\n        doc[ _addEventListener ](prefix + 'MozMousePixelScroll', MouseWheelHandler, passiveEvent);\n    }\n\n    //handle MozMousePixelScroll in older Firefox\n    else{\n        doc[ _addEventListener ](prefix + support, MouseWheelHandler, passiveEvent);\n    }\n}\n\n\n/**\n* Binding the mousemove when the mouse's middle button is pressed\n*/\nfunction addMiddleWheelHandler(){\n    getContainer().addEventListener('mousedown', mouseDownHandler);\n    getContainer().addEventListener('mouseup', mouseUpHandler);\n}\n\n\n/**\n* Removes the auto scrolling action fired by the mouse wheel and trackpad.\n* After this function is called, the mousewheel and trackpad movements won't scroll through sections.\n*/\nfunction removeMouseWheelHandler(){\n    if (doc.addEventListener) {\n        utils.docRemoveEvent('mousewheel', MouseWheelHandler, false); //IE9, Chrome, Safari, Oper\n        utils.docRemoveEvent('wheel', MouseWheelHandler, false); //Firefox\n        utils.docRemoveEvent('MozMousePixelScroll', MouseWheelHandler, false); //old Firefox\n    } else {\n        // @ts-ignore\n        doc.detachEvent('onmousewheel', MouseWheelHandler); //IE 6/7/8\n    }\n}\n\n/**\n* Unbinding the mousemove when the mouse's middle button is released\n*/\nfunction removeMiddleWheelHandler(){\n    getContainer().removeEventListener('mousedown', mouseDownHandler);\n    getContainer().removeEventListener('mouseup', mouseUpHandler);\n}\n\n/**\n * Determines if the wheel movement should trigger scrolling based on acceleration\n * @param {Array} scrollings - Array of scroll values\n * @returns {boolean} - True if accelerating\n */\nfunction isAccelerating(scrollings) {    \n    var averageEnd = utils.getAverage(scrollings, 10);\n    var averageMiddle = utils.getAverage(scrollings, 70);\n    return averageEnd >= averageMiddle;\n}\n\n/**\n * Detecting mousewheel scrolling\n *\n * http://blogs.sitepointstatic.com/examples/tech/mouse-wheel/index.html\n * http://www.sitepoint.com/html5-javascript-mouse-wheel/\n */\n\nfunction MouseWheelHandler(e) {\n    var curTime = new Date().getTime();\n    var isNormalScroll = utils.hasClass(utils.$(COMPLETELY_SEL)[0], NORMAL_SCROLL);\n    var isScrollAllowedBeyondFullPage = beyondFullPageHandler(getContainer(), e);\n\n    if(!state.isUsingWheel){\n        setState({\n            isGrabbing: false,\n            isUsingWheel: true,\n            touchDirection: 'none'\n        });\n    }\n\n    if(isScrollAllowedBeyondFullPage){\n        return true;\n    }\n    else if (isScrollAllowedBeyondFullPage === false){\n        utils.preventDefault(e);\n        return false;\n    }\n\n    //autoscrolling and not zooming?\n    if(getOptions().autoScrolling && !getControlPressed() && !isNormalScroll){\n        // cross-browser wheel delta\n        e = e || win.event;\n        // @ts-ignore - cross-browser compatibility\n        var value = e.wheelDelta || -e.deltaY || -e.detail;\n        var delta = Math.max(-1, Math.min(1, value));\n\n        // @ts-ignore - cross-browser compatibility\n        var horizontalValue = e.wheelDeltaX || -e.deltaX || 0;\n        // @ts-ignore - cross-browser compatibility\n        var deltaY = e.deltaY || 0;\n        // @ts-ignore - cross-browser compatibility\n        var deltaX = e.deltaX || 0;\n        \n        // Detect horizontal scrolling: SHIFT key pressed OR horizontal delta is larger than vertical\n        // @ts-ignore - cross-browser compatibility\n        var isShiftPressed = e.shiftKey || false;\n        var horizontalDetection = Math.abs(horizontalValue) > 0 || Math.abs(deltaX) > 0;\n        // @ts-ignore - cross-browser compatibility\n        var isScrollingVertically = !isShiftPressed && (Math.abs(deltaX) < Math.abs(deltaY) || !horizontalDetection);\n        var isScrollingHorizontally = isShiftPressed || (!isScrollingVertically && horizontalDetection && Math.abs(deltaX) > Math.abs(deltaY));\n        \n        var direction = delta < 0 ? 'down': delta > 0 ? 'up' : 'none';\n        \n        // Get horizontal delta for horizontal scrolling\n        // For SHIFT+wheel, use the vertical delta as horizontal\n        var horizontalDelta = isShiftPressed ? delta : Math.max(-1, Math.min(1, horizontalValue));\n        var horizontalDirection = isScrollingHorizontally ? (horizontalDelta < 0 ? 'right' : horizontalDelta > 0 ? 'left' : 'none') : 'none';\n        \n        //is scroll allowed for the detected direction?\n        if(isScrollingVertically && !getIsScrollAllowed().m.down && !getIsScrollAllowed().m.up) {\n            return false;\n        }\n        if(isScrollingHorizontally && horizontalDirection === 'left' && !getIsScrollAllowed().m.left) {\n            return false;\n        }\n        if(isScrollingHorizontally && horizontalDirection === 'right' && !getIsScrollAllowed().m.right) {\n            return false;\n        }\n\n        //Limiting the arrays to 150 (lets not waste memory!)\n        if(scrollings.length > 149){\n            scrollings.shift();\n        }\n        if(horizontalScrollings.length > 149){\n            horizontalScrollings.shift();\n        }\n\n        //keeping record of the previous scrollings\n        if(isScrollingVertically) {\n            scrollings.push(Math.abs(value));\n        } \n        else if(isScrollingHorizontally) {\n            // For SHIFT+wheel, use the vertical value as horizontal\n            var horizontalScrollValue = isShiftPressed ? Math.abs(value) : Math.abs(horizontalValue);\n            horizontalScrollings.push(horizontalScrollValue);\n        }\n\n        //preventing to scroll the site on mouse wheel when scrollbar is present\n        if(getOptions().scrollBar || !getOptions().scrollOverflow){\n            utils.preventDefault(e);\n        }\n\n        //time difference between the last scroll and the current one\n        var timeDiff = curTime-prevTime;\n        var horizontalTimeDiff = curTime-prevHorizontalTime;\n        \n        if(isScrollingVertically) {\n            prevTime = curTime;\n        } else if(isScrollingHorizontally) {\n            prevHorizontalTime = curTime;\n        }\n\n        //haven't they scrolled in a while?\n        //(enough to be consider a different scrolling action to scroll another section)\n        if(timeDiff > 200){\n            //emptying the arrays, we dont care about old scrollings for our averages\n            scrollings = [];\n        }\n        if(horizontalTimeDiff > 200){\n            horizontalScrollings = [];\n        }\n\n        setState({wheelDirection: direction});\n\n        if(state.canScroll){\n            // Handle vertical scrolling\n            if(isScrollingVertically && isAccelerating(scrollings)){\n                setState({scrollTrigger: 'wheel'});\n\n                //scrolling down?\n                if (delta < 0) {\n                    scrolling('down');\n                }\n\n                //scrolling up?\n                else {\n                    scrolling('up');\n                }\n            }\n            // Handle horizontal scrolling\n            // SHIFT+wheel doesn't require acceleration (intentional gesture)\n            else if(isScrollingHorizontally && (isShiftPressed || isAccelerating(horizontalScrollings))){\n                setState({scrollTrigger: 'wheel'});\n                \n                if(horizontalDirection === 'left'){\n                    moveSlideLeft();\n                } else if(horizontalDirection === 'right'){\n                    moveSlideRight();\n                }\n            }\n        }\n\n        return false;\n    }\n\n    if(getOptions().fitToSection){\n        //stopping the auto scroll to adjust to a section\n        setState({activeAnimation: false});\n    }\n}\n\n//binding the mousemove when the mouse's middle button is released\nfunction mouseDownHandler(e){\n    //middle button\n    if (e.which == 2){\n        setOldPageY(e.pageY);\n        getContainer().addEventListener('mousemove', mouseMoveHandler);\n    }\n}\n\n\n//unbinding the mousemove when the mouse's middle button is released\nfunction mouseUpHandler(e){\n    //middle button\n    if (e.which == 2){\n        getContainer().removeEventListener('mousemove', mouseMoveHandler);\n    }\n}\n\n\n/**\n* Adds or remove the mouse wheel hijacking\n*/\nexport function setMouseHijack(value){\n    if(value){\n        setMouseWheelScrolling(true);\n        addTouchHandler();\n    }else{\n        setMouseWheelScrolling(false);\n        removeTouchHandler();\n    }\n}"
  },
  {
    "path": "src/js/nav/getBulletLinkName.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions } from \"../common/options.js\";\n\n/**\n* Gets the name for screen readers for a section/slide navigation bullet.\n*/\nexport function getBulletLinkName(i, defaultName, item){\n    var anchor = defaultName === 'Section' ? getOptions().anchors[i] : utils.getAttr(item, 'data-anchor');\n    return encodeURI(getOptions().navigationTooltips[i] || \n        anchor || \n        defaultName + ' ' + (i+1));\n}"
  },
  {
    "path": "src/js/nav/index.js",
    "content": "import * as utils from '../common/utils.js';\nimport {\n    SECTION_NAV_SEL,\n    SECTION_NAV_TOOLTIP_SEL,\n    SLIDES_NAV_LINK_SEL,\n} from '../common/selectors.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { slideBulletHandler } from './slides.js';\nimport { sectionBulletHandler, tooltipTextHandler } from './sections.js';\nimport { events } from '../common/events.js';\n\nEventEmitter.on(events.bindEvents, bindEvents);\n\nfunction bindEvents(){\n    EventEmitter.on(events.onClickOrTouch, onClickOrTouch);\n}\n\nfunction onClickOrTouch(params){\n    var target = params.target;\n    \n    if(target && utils.closest(target, SECTION_NAV_SEL + ' a')){\n        sectionBulletHandler.call(target, params.e);\n    }\n\n    else if(utils.matches(target, SECTION_NAV_TOOLTIP_SEL)){\n        tooltipTextHandler.call(target);\n    }\n\n    else if(utils.matches(target, SLIDES_NAV_LINK_SEL) || utils.closest(target, SLIDES_NAV_LINK_SEL) != null){\n        slideBulletHandler.call(target, params.e);\n    }\n}"
  },
  {
    "path": "src/js/nav/sections.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions } from '../common/options.js';\nimport { getState, setState } from '../common/state.js';\nimport { $body } from '../common/cache.js';\nimport {\n    ACTIVE,\n    ACTIVE_SEL,\n    SECTION_NAV_SEL,\n    SECTION_NAV, \n    SECTION_NAV_TOOLTIP,\n    SHOW_ACTIVE_TOOLTIP\n} from '../common/selectors.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { getBulletLinkName } from './getBulletLinkName.js';\nimport { doc } from '../common/constants.js';\nimport { events } from '../common/events.js';\n\nexport function tooltipTextHandler(){\n    /*jshint validthis:true */\n    utils.trigger(utils.prev(this), 'click');\n}\n\n/**\n* Activating the vertical navigation bullets according to the given slide name.\n*/\nexport function activateNavDots(name, sectionIndex){\n    var nav = utils.$(SECTION_NAV_SEL)[0];\n    if(getOptions().navigation && nav != null && nav.style.display !== 'none'){\n        utils.removeClass(utils.$(ACTIVE_SEL, nav), ACTIVE);\n        if(name){\n            utils.addClass( utils.$('a[href=\"#' + name + '\"]', nav), ACTIVE);\n        }else{\n            utils.addClass(utils.$('a', utils.$('li', nav)[sectionIndex]), ACTIVE);\n        }\n    }\n}\n\n/**\n* Creates a vertical navigation bar.\n*/\nexport function addVerticalNavigation(){\n    utils.remove(utils.$(SECTION_NAV_SEL));\n\n    var navigation = doc.createElement('div');\n    navigation.setAttribute('id', SECTION_NAV);\n\n    var divUl = doc.createElement('ul');\n    navigation.appendChild(divUl);\n\n    utils.appendTo(navigation, $body);\n    var nav = utils.$(SECTION_NAV_SEL)[0];\n\n    utils.addClass(nav, 'fp-' + getOptions().navigationPosition);\n\n    if(getOptions().showActiveTooltip){\n        utils.addClass(nav, SHOW_ACTIVE_TOOLTIP);\n    }\n\n    var li = '';\n\n    for (var i = 0; i < getState().sections.length; i++) {\n        var section = getState().sections[i];\n        var link = '';\n        if (getOptions().anchors.length) {\n            link = section.anchor;\n        }\n\n        li += '<li><a href=\"#' + encodeURI(link) + '\"><span class=\"fp-sr-only\">' + getBulletLinkName(section.index(), 'Section') + '</span><span></span></a>';\n\n        // Only add tooltip if needed (defined by user)\n        var tooltip = getOptions().navigationTooltips[section.index()];\n\n        if (typeof tooltip !== 'undefined' && tooltip !== '') {\n            li += '<div class=\"' + SECTION_NAV_TOOLTIP + ' fp-' + getOptions().navigationPosition + '\">' + tooltip + '</div>';\n        }\n\n        li += '</li>';\n    }\n    utils.$('ul', nav)[0].innerHTML = li;\n    \n    //activating the current active section\n    var bullet = utils.$('li', utils.$(SECTION_NAV_SEL)[0])[getState().activeSection.index()];\n    utils.addClass(utils.$('a', bullet), ACTIVE);\n}\n\n\n//Scrolls to the section when clicking the navigation bullet\nexport function sectionBulletHandler(e){\n    if(e.preventDefault){\n        utils.preventDefault(e);\n    }\n\n    setState({scrollTrigger: 'verticalNav'});\n\n    /*jshint validthis:true */\n    // @ts-ignore\n    var indexBullet = utils.index(utils.closest(this, SECTION_NAV_SEL + ' li'));\n\n    EventEmitter.emit(events.scrollPage, {\n        destination: getState().sections[indexBullet]\n    });\n}\n"
  },
  {
    "path": "src/js/nav/slides.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions } from '../common/options.js';\nimport { getState, setState } from '../common/state.js';\nimport {\n    ACTIVE,\n    ACTIVE_SEL,\n    SLIDES_NAV_SEL,\n    SLIDES_NAV,\n    SLIDE_SEL,\n    SLIDES_WRAPPER_SEL,\n    SECTION_SEL\n} from '../common/selectors.js';\nimport { getPanelByElement } from '../common/item.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { getBulletLinkName } from './getBulletLinkName.js';\nimport { events } from '../common/events.js';\n\n//Scrolls the slider to the given slide destination for the given section\nexport function slideBulletHandler(e){\n\n    // not all events are cancellable \n    // https://www.uriports.com/blog/easy-fix-for-intervention-ignored-attempt-to-cancel-a-touchmove-event-with-cancelable-false/\n    if(e.cancelable){\n        utils.preventDefault(e);\n    }\n\n    setState({scrollTrigger: 'horizontalNav'});\n\n    /*jshint validthis:true */\n    var sectionElem = utils.closest(this, SECTION_SEL);\n    var slides = utils.$(SLIDES_WRAPPER_SEL, utils.closest(this, SECTION_SEL))[0];\n    var section = getPanelByElement(getState().sections, sectionElem);\n    var destiny = section.slides[utils.index(utils.closest(this, 'li'))];\n\n    EventEmitter.emit(events.landscapeScroll, {\n        slides: slides, \n        destination: destiny.item\n    });\n}\n\n\n/**\n* Sets the state for the horizontal bullet navigations.\n*/\nexport function activeSlidesNavigation(slidesNav, slideIndex){\n    if(getOptions().slidesNavigation && slidesNav != null){\n        utils.removeClass(utils.$(ACTIVE_SEL, slidesNav), ACTIVE);\n        utils.addClass( utils.$('a', utils.$('li', slidesNav)[slideIndex] ), ACTIVE);\n    }\n}\n\n/**\n* Creates a landscape navigation bar with dots for horizontal sliders.\n*/\nexport function addSlidesNavigation(section){\n    var sectionElem = section.item;\n    var numSlides = section.slides.length;\n    utils.appendTo(utils.createElementFromHTML('<div class=\"' + SLIDES_NAV + '\"><ul></ul></div>'), sectionElem);\n    var nav = utils.$(SLIDES_NAV_SEL, sectionElem)[0];\n\n    //top or bottom\n    utils.addClass(nav, 'fp-' + getOptions().slidesNavPosition);\n\n    for(var i=0; i< numSlides; i++){\n        var slide = utils.$(SLIDE_SEL, sectionElem)[i];\n        utils.appendTo(utils.createElementFromHTML('<li><a href=\"#\"><span class=\"fp-sr-only\">'+ getBulletLinkName(i, 'Slide', slide) +'</span><span></span></a></li>'), utils.$('ul', nav)[0] );\n    }\n\n    //centering it\n    utils.css(nav, {'margin-left': '-' + (nav.innerWidth/2) + 'px'});\n\n    var activeSlideIndex = section.activeSlide ? section.activeSlide.index() : 0;\n    utils.addClass(utils.$('a', utils.$('li', nav)[activeSlideIndex] ), ACTIVE);\n}\n"
  },
  {
    "path": "src/js/normalScrollElements.js",
    "content": "import * as utils from './common/utils.js';\nimport { setMouseHijack } from './mouse/wheel.js';\nimport { getOptions } from './common/options.js';\nimport { FP } from './common/constants.js';\nimport { EventEmitter } from './common/eventEmitter.js';\nimport { events } from './common/events.js';\n\nlet g_canFireMouseEnterNormalScroll = true;\n\nEventEmitter.on(events.bindEvents, bindEvents);\n\nfunction bindEvents(){\n    /**\n    * Applying normalScroll elements.\n    * Ignoring the scrolls over the specified selectors.\n    */\n    if(getOptions().normalScrollElements){\n        ['mouseenter', 'touchstart'].forEach(function(eventName){\n            forMouseLeaveOrTouch(eventName, false);\n        });\n\n        ['mouseleave', 'touchend'].forEach(function(eventName){\n            forMouseLeaveOrTouch(eventName, true);\n        });\n    }\n\n    EventEmitter.on(events.onDestroy, onDestroy);\n}\n\nfunction onDestroy(){\n    ['mouseenter', 'touchstart', 'mouseleave', 'touchend'].forEach(function(eventName){\n        utils.docRemoveEvent(eventName, onMouseEnterOrLeave, true); //true is required!\n    });\n}\n\nfunction forMouseLeaveOrTouch(eventName, allowScrolling){\n    //a way to pass arguments to the onMouseEnterOrLeave function\n    document['fp_' + eventName] = allowScrolling;\n    utils.docAddEvent(eventName, onMouseEnterOrLeave, true); //capturing phase\n}\n\nfunction onMouseEnterOrLeave(e) {\n    var type = e.type;\n    var isInsideOneNormalScroll = false;\n\n    //onMouseLeave will use the destination target, not the one we are moving away from\n    var target = type === 'mouseleave' ? e.toElement || e.relatedTarget : e.target;\n\n    //coming from closing a normalScrollElements modal or moving outside viewport?\n    if(target == document || !target){\n        setMouseHijack(true);\n\n        return;\n    }\n\n    if(type === 'touchend'){\n        g_canFireMouseEnterNormalScroll = false;\n        setTimeout(function(){\n            g_canFireMouseEnterNormalScroll = true;\n        }, 800);\n    }\n\n    //preventing mouseenter event to do anything when coming from a touchEnd event\n    //fixing issue #3576\n    if(type === 'mouseenter' && !g_canFireMouseEnterNormalScroll){\n        return;\n    }\n\n    var normalSelectors = getOptions().normalScrollElements.split(',');\n\n    normalSelectors.forEach(function(normalSelector){\n        if(!isInsideOneNormalScroll){\n            var isNormalScrollTarget = utils.matches(target, normalSelector);\n\n            //leaving a child inside the normalScoll element is not leaving the normalScroll #3661\n            var isNormalScrollChildFocused = utils.closest(target, normalSelector);\n\n            if(isNormalScrollTarget || isNormalScrollChildFocused){\n                if(!FP.shared.isNormalScrollElement){\n                    setMouseHijack(false);\n                }\n                FP.shared.isNormalScrollElement = true;\n                isInsideOneNormalScroll = true;\n            }\n        }\n    });\n\n    //not inside a single normal scroll element anymore?\n    if(!isInsideOneNormalScroll && FP.shared.isNormalScrollElement){\n        setMouseHijack(true);\n\n        FP.shared.isNormalScrollElement = false;\n    }\n}"
  },
  {
    "path": "src/js/optionsDefault.js",
    "content": "import { SECTION_DEFAULT_SEL, SLIDES_STYLED_ARROW, SLIDE_DEFAULT_SEL } from \"./common/selectors.js\";\n\nexport const defaultOptions = {\n    //navigation\n    menu: false,\n    anchors:[],\n    lockAnchors: false,\n    navigation: false,\n    navigationPosition: 'right',\n    navigationTooltips: [],\n    showActiveTooltip: false,\n    slidesNavigation: false,\n    slidesNavPosition: 'bottom',\n    scrollBar: false,\n    hybrid: false,\n\n    licenseKey: '',\n    credits: {\n        \"enabled\": true,\n        \"label\": 'Made with fullPage.js',\n        \"position\": 'right'\n    },\n\n    //scrolling\n    css3: true,\n    scrollingSpeed: 700,\n    autoScrolling: true,\n    fitToSection: true,\n    fitToSectionDelay: 600,\n    easing: 'easeInOutCubic',\n    easingcss3: 'ease',\n    loopBottom: false,\n    loopTop: false,\n    loopHorizontal: true,\n    continuousVertical: false,\n    continuousHorizontal: false,\n    scrollHorizontally: false,\n    interlockedSlides: false,\n    dragAndMove: false,\n    offsetSections: false,\n    resetSliders: false,\n    fadingEffect: false,\n    normalScrollElements: null,\n    scrollOverflow: true,\n    scrollOverflowReset: false,\n    skipIntermediateItems: false,\n    touchSensitivity: 5,\n    touchWrapper: null,\n    bigSectionsDestination: null,\n    adjustOnNavChange: true,\n\n    //Accessibility\n    keyboardScrolling: true,\n    animateAnchor: true,\n    recordHistory: true,\n    allowCorrectDirection: false,\n\n    //design\n    scrollOverflowMacStyle: true,\n    controlArrows: true,\n    controlArrowsHTML: ['<div class=\"' + SLIDES_STYLED_ARROW + '\"></div>', '<div class=\"' + SLIDES_STYLED_ARROW + '\"></div>'],\n    controlArrowColor: '#fff',\n    verticalCentered: true,\n    sectionsColor : [],\n    paddingTop: 0,\n    paddingBottom: 0,\n    fixedElements: null,\n    responsive: 0, //backwards compabitility with responsiveWiddth\n    responsiveWidth: 0,\n    responsiveHeight: 0,\n    responsiveSlides: false,\n    parallax: false,\n    parallaxOptions: {\n        type: 'reveal',\n        percentage: 62,\n        property: 'translate'\n    },\n    cards: false,\n    cardsOptions: {\n        perspective: 100,\n        fadeContent: true,\n        fadeBackground: true\n    },\n\n    //Custom selectors\n    sectionSelector: SECTION_DEFAULT_SEL,\n    slideSelector: SLIDE_DEFAULT_SEL,\n\n    //events\n    afterLoad: null,\n    beforeLeave: null,\n    onLeave: null,\n    afterRender: null,\n    afterResize: null,\n    afterReBuild: null,\n    afterSlideLoad: null,\n    onSlideLeave: null,\n    afterResponsive: null,\n    onScrollOverflow: null,\n\n    lazyLoading: true,\n    lazyLoadThreshold: 0,\n    observer: true,\n    scrollBeyondFullpage: true,\n    rtl: false\n};"
  },
  {
    "path": "src/js/polyfills/array.find.js",
    "content": "// https://tc39.github.io/ecma262/#sec-array.prototype.find\nif (!Array.prototype.find) {\n    Object.defineProperty(Array.prototype, 'find', {\n        value: function(predicate) {\n            // 1. Let O be ? ToObject(this value).\n            if (this == null) {\n                throw new TypeError('\"this\" is null or not defined');\n            }\n\n            var o = Object(this);\n\n            // 2. Let len be ? ToLength(? Get(O, \"length\")).\n            var len = o.length >>> 0;\n\n            // 3. If IsCallable(predicate) is false, throw a TypeError exception.\n            if (typeof predicate !== 'function') {\n                throw new TypeError('predicate must be a function');\n            }\n\n            // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.\n            var thisArg = arguments[1];\n\n            // 5. Let k be 0.\n            var k = 0;\n\n            // 6. Repeat, while k < len\n            while (k < len) {\n                // a. Let Pk be ! ToString(k).\n                // b. Let kValue be ? Get(O, Pk).\n                // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).\n                // d. If testResult is true, return kValue.\n                var kValue = o[k];\n                if (predicate.call(thisArg, kValue, k, o)) {\n                    return kValue;\n                }\n                // e. Increase k by 1.\n                k++;\n            }\n\n            // 7. Return undefined.\n            return undefined;\n        }\n    });\n}"
  },
  {
    "path": "src/js/polyfills/array.foreach.js",
    "content": "import { win } from \"../common/constants.js\";\n\n/**\n* forEach polyfill for IE\n* https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach#Browser_Compatibility\n*/\nif (win.NodeList && !NodeList.prototype.forEach) {\n    NodeList.prototype.forEach = function (callback, thisArg) {\n        thisArg = thisArg || window;\n        for (var i = 0; i < this.length; i++) {\n            callback.call(thisArg, this[i], i, this);\n        }\n    };\n}"
  },
  {
    "path": "src/js/polyfills/array.from.js",
    "content": "// Production steps of ECMA-262, Edition 6, 22.1.2.1\nif (!Array.from) {\n    Array.from = (function() {\n        var toStr = Object.prototype.toString;\n        var isCallable = function(fn) {\n            return (\n                typeof fn === 'function' ||\n                toStr.call(fn) === '[object Function]'\n            );\n        };\n        var toInteger = function(value) {\n            var number = Number(value);\n            if (isNaN(number)) {\n                return 0;\n            }\n            if (number === 0 || !isFinite(number)) {\n                return number;\n            }\n            return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));\n        };\n        var maxSafeInteger = Math.pow(2, 53) - 1;\n        var toLength = function(value) {\n            var len = toInteger(value);\n            return Math.min(Math.max(len, 0), maxSafeInteger);\n        };\n\n        // The length property of the from method is 1.\n        return function from(arrayLike /*, mapFn, thisArg */) {\n            // 1. Let C be the this value.\n            var C = this;\n\n            // 2. Let items be ToObject(arrayLike).\n            var items = Object(arrayLike);\n\n            // 3. ReturnIfAbrupt(items).\n            if (arrayLike == null) {\n                throw new TypeError(\n                    'Array.from requires an array-like object - not null or undefined'\n                );\n            }\n\n            // 4. If mapfn is undefined, then let mapping be false.\n            var mapFn = arguments.length > 1 ? arguments[1] : void undefined;\n            var T;\n            if (typeof mapFn !== 'undefined') {\n                // 5. else\n                // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.\n                if (!isCallable(mapFn)) {\n                    throw new TypeError(\n                        'Array.from: when provided, the second argument must be a function'\n                    );\n                }\n\n                // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.\n                if (arguments.length > 2) {\n                    T = arguments[2];\n                }\n            }\n\n            // 10. Let lenValue be Get(items, \"length\").\n            // 11. Let len be ToLength(lenValue).\n            var len = toLength(items.length);\n\n            // 13. If IsConstructor(C) is true, then\n            // 13. a. Let A be the result of calling the [[Construct]] internal method\n            // of C with an argument list containing the single item len.\n            // 14. a. Else, Let A be ArrayCreate(len).\n            var A = isCallable(C) ? Object(new C(len)) : new Array(len);\n\n            // 16. Let k be 0.\n            var k = 0;\n            // 17. Repeat, while k < len… (also steps a - h)\n            var kValue;\n            while (k < len) {\n                kValue = items[k];\n                if (mapFn) {\n                    A[k] =\n                        typeof T === 'undefined'\n                            ? mapFn(kValue, k)\n                            : mapFn.call(T, kValue, k);\n                } else {\n                    A[k] = kValue;\n                }\n                k += 1;\n            }\n            // 18. Let putStatus be Put(A, \"length\", len, true).\n            A.length = len;\n            // 20. Return A.\n            return A;\n        };\n    })();\n}"
  },
  {
    "path": "src/js/polyfills/index.js",
    "content": "import './array.find.js';\nimport './array.from.js';\nimport './array.foreach.js';\nimport './object.assign.js';\nimport './string.padStart.js';"
  },
  {
    "path": "src/js/polyfills/object.assign.js",
    "content": "if (typeof Object.assign != 'function') {\n    // Must be writable: true, enumerable: false, configurable: true\n    Object.defineProperty(Object, 'assign', {\n        value: function assign(target, varArgs) {\n            // .length of function is 2\n            'use strict';\n            if (target == null) {\n                // TypeError if undefined or null\n                throw new TypeError(\n                    'Cannot convert undefined or null to object'\n                );\n            }\n\n            var to = Object(target);\n\n            for (var index = 1; index < arguments.length; index++) {\n                var nextSource = arguments[index];\n\n                if (nextSource != null) {\n                    // Skip over if undefined or null\n                    for (var nextKey in nextSource) {\n                        // Avoid bugs when hasOwnProperty is shadowed\n                        if (\n                            Object.prototype.hasOwnProperty.call(\n                                nextSource,\n                                nextKey\n                            )\n                        ) {\n                            to[nextKey] = nextSource[nextKey];\n                        }\n                    }\n                }\n            }\n            return to;\n        },\n        writable: true,\n        configurable: true\n    });\n}"
  },
  {
    "path": "src/js/polyfills/string.padStart.js",
    "content": "// https://stackoverflow.com/questions/51719553/padstart-not-working-in-ie11\n// https://github.com/behnammodi/polyfill/blob/master/string.polyfill.js\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart\nif (!String.prototype.padStart) {\n    String.prototype.padStart = function padStart(targetLength,padString) {\n        targetLength = targetLength>>0; //truncate if number or convert non-number to 0;\n        padString = String((typeof padString !== 'undefined' ? padString : ' '));\n        if (this.length > targetLength) {\n            return String(this);\n        }\n        else {\n            targetLength = targetLength-this.length;\n            if (targetLength > padString.length) {\n                padString += Array.apply(null, Array(targetLength)).map(function(){ return padString; }).join(\"\");\n            }\n            return padString.slice(0,targetLength) + String(this);\n        }\n    };\n}"
  },
  {
    "path": "src/js/resize.js",
    "content": "import * as utils from './common/utils.js';\nimport { getOptions, getContainer } from './common/options.js';\nimport { updateState } from './stateUpdates.js';\nimport { getState, state, setState } from './common/state.js';\nimport { responsive } from './responsive.js';\nimport { isTouchDevice, FP, win, doc }  from './common/constants.js';\nimport { landscapeScroll } from './slides/landscapeScroll.js';\nimport { scrollOverflowHandler } from './scrolloverflow.js';\nimport { \n    SLIDES_WRAPPER_SEL,\n    DESTROYED\n} from './common/selectors.js';\nimport { EventEmitter } from './common/eventEmitter.js';\nimport { silentMoveTo } from './scroll/silentMove.js';\nimport { events } from './common/events.js';\n\nlet previousHeight = utils.getWindowHeight();\nlet windowsWidth = utils.getWindowWidth();\nlet g_resizeId;\nlet g_isConsecutiveResize = false;\nlet g_resizeMobileHandlerId;\nFP.reBuild = reBuild;\n\nEventEmitter.on(events.bindEvents, bindEvents);\n\nfunction bindEvents(){\n\n    // Setting VH correctly in mobile devices\n    resizeHandler();\n    \n    //when resizing the site, we adjust the heights of the sections, slimScroll...\n    utils.windowAddEvent('resize', resizeHandler);\n    EventEmitter.on(events.onDestroy, onDestroy);\n}\n\nfunction onDestroy(){\n    clearTimeout(g_resizeId);\n    clearTimeout(g_resizeMobileHandlerId);\n    utils.windowRemoveEvent('resize', resizeHandler);\n}\n\n/*\n* Resize event handler.\n*/        \nfunction resizeHandler(){\n    if(!g_isConsecutiveResize){\n        if(getOptions().autoScrolling && !getOptions().scrollBar || !getOptions().fitToSection){\n            setSectionsHeight(utils.getWindowHeight());\n        }\n    }\n\n    // we won't trigger fit to section on page load\n    // otherwise it will scroll to the worng section if using anchors #4613\n    if(state.isFullpageInitDone){\n        fitToActiveSection();\n    }\n\n    g_isConsecutiveResize = true;\n\n    //in order to call the functions only when the resize is finished\n    //http://stackoverflow.com/questions/4298612/jquery-how-to-call-resize-event-only-once-its-finished-resizing    \n    clearTimeout(g_resizeId);\n    g_resizeId = setTimeout(function(){\n\n        //issue #3336 \n        //(some apps or browsers, like Chrome/Firefox for Mobile take time to report the real height)\n        //so we check it 3 times with intervals in that case\n        // for(var i = 0; i< 4; i++){\n            resizeActions();\n            g_isConsecutiveResize = false;\n        // }\n    }, 400);\n}\n\nfunction fitToActiveSection(){\n\n    if (isTouchDevice) {\n\n        // Issue #4393 and previously in v3, #3336\n        // (some apps or browsers, like Chrome/Firefox will delay a bit to scroll \n        // to the focused input\n        for(var i = 0; i< 4; i++){\n            g_resizeMobileHandlerId = setTimeout(function(){\n                window.requestAnimationFrame(function(){\n                    \n                    // on Android devices the browser scrolls to the focused element\n                    // messing up the whole page structure. So we need to update the\n                    // translate3d value when the keyboard shows/hides\n                    if(getOptions().autoScrolling && !getOptions().scrollBar){\n                        setState({isResizing: true});\n                        silentMoveTo(state.activeSection.index() + 1);\n                        setState({isResizing: false});\n                    }\n                });\n            }, 200 * i);\n        }\n    }\n}\n\n/**\n * Checks if VH units need to be set based on scrolling configuration\n */\nfunction shouldSetVhUnits() {\n    return !state.isBeyondFullpage && !getOptions().autoScrolling;\n}\n\n/**\n* When resizing the site, we adjust the heights of the sections, slimScroll...\n*/\nfunction resizeActions(){\n    setState({isResizing: true});\n\n    if(!isTouchDevice || getOptions().adjustOnNavChange){\n        setSectionsHeight('');\n\n        if(shouldSetVhUnits()) {\n            setVhUnits();\n        }\n    }\n\n    EventEmitter.emit(events.contentChanged);\n    updateState();\n\n    //checking if it needs to get responsive\n    responsive();\n\n    // rebuild immediately on touch devices\n    if (isTouchDevice) {\n        var activeElement = doc.activeElement;\n\n        //if the keyboard is NOT visible\n        if (!utils.matches(activeElement, 'textarea') && !utils.matches(activeElement, 'input') && !utils.matches(activeElement, 'select')) {\n            var currentHeight = utils.getWindowHeight();\n            //making sure the change in the viewport size is enough to force a rebuild. (20 % of the window to avoid problems when hidding scroll bars)\n            if( Math.abs(currentHeight - previousHeight) > (20 * Math.max(previousHeight, currentHeight) / 100) ){\n                reBuild(true);\n                previousHeight = currentHeight;\n            }\n        }\n    }\n    else{\n        adjustToNewViewport();\n    }\n\n    setState({isResizing: false});\n}\n\n/**\n * When resizing is finished, we adjust the slides sizes and positions\n */\nfunction reBuild(resizing){\n    if(utils.hasClass(getContainer(), DESTROYED)){ return; }  //nothing to do if the plugin was destroyed\n\n    //updating global vars\n    setState({\n        isResizing: true,\n        windowsHeight: utils.getWindowHeight(),\n        windowsWidth: utils.getWindowWidth()\n    });\n\n    var sections = getState().sections;\n    for (var i = 0; i < sections.length; ++i) {\n        var section = sections[i];\n        var slidesWrap = utils.$(SLIDES_WRAPPER_SEL, section.item)[0];\n        var slides = section.slides;\n\n        //adjusting the position fo the FULL WIDTH slides...\n        if (slides.length > 1) {\n            landscapeScroll(slidesWrap, section.activeSlide.item);\n        }\n    }\n\n    if(getOptions().scrollOverflow){\n        scrollOverflowHandler.makeScrollable();\n    }\n\n    var sectionIndex = getState().activeSection.index();\n\n    if(!state.isBeyondFullpage){\n        //isn't it the first section?\n        if(sectionIndex){\n            //adjusting the position for the current section\n            silentMoveTo(sectionIndex + 1);\n        }\n    }\n\n    setState({isResizing: false});\n\n    if(utils.isFunction( getOptions().afterResize ) && resizing){\n        getOptions().afterResize.call(getContainer(), win.innerWidth, win.innerHeight);\n    }\n    if(utils.isFunction( getOptions().afterReBuild ) && !resizing){\n        getOptions().afterReBuild.call(getContainer());\n    }\n\n    utils.trigger(getContainer(), 'afterRebuild');\n}\n\n/**\n* Adjusts a section to the viewport if it has changed.\n*/\nfunction adjustToNewViewport(){\n    var newWindowHeight = utils.getWindowHeight();\n    var newWindowWidth = utils.getWindowWidth();\n\n    if(state.windowsHeight !== newWindowHeight || windowsWidth !== newWindowWidth){\n        setState({windowsHeight: newWindowHeight});\n        windowsWidth = newWindowWidth;\n        reBuild(true);\n    }\n}\n\nfunction setSectionsHeight(value){\n    var propertyValue = value === '' ? '' : value + 'px';\n    getState().sections.forEach(function(section){\n        utils.css(section.item, {\n            'height': propertyValue\n        });\n    });\n}\n\n/**\n * Defining the value in px of a VH unit. (Used for autoScrolling: false)\n * To fix the height issue on mobile devices when using VH units.\n * https://css-tricks.com/the-trick-to-viewport-units-on-mobile/\n */\nfunction setVhUnits(){\n    // First we get the viewport height and we multiple it by 1% to get a value for a vh unit\n    let vh = win.innerHeight * 0.01;\n\n    // Then we set the value in the --vh custom property to the root of the document\n    doc.documentElement.style.setProperty('--vh', `${vh}px`);\n    \n}"
  },
  {
    "path": "src/js/responsive.js",
    "content": "import * as utils from './common/utils.js';\nimport { getOptions, getContainer, getOriginals} from './common/options.js';\nimport { setAutoScrolling } from './autoScrolling.js';\nimport { setFitToSection } from './fitToSection.js';\nimport { FP, win } from './common/constants.js';\nimport { $body } from './common/cache.js';\nimport { \n    SECTION_NAV_SEL,\n    RESPONSIVE\n} from './common/selectors.js';\n\nFP.setResponsive = setResponsive;\n\n\n/**\n* Checks if the site needs to get responsive and disables autoScrolling if so.\n* A class `fp-responsive` is added to the plugin's container in case the user wants to use it for his own responsive CSS.\n*/\nexport function responsive(){\n    var widthLimit = getOptions().responsive || getOptions().responsiveWidth; //backwards compatiblity\n    var heightLimit = getOptions().responsiveHeight;\n\n    //only calculating what we need. Remember its called on the resize event.\n    var isBreakingPointWidth = widthLimit && win.innerWidth < widthLimit;\n    var isBreakingPointHeight = heightLimit && win.innerHeight < heightLimit;\n\n    if(widthLimit && heightLimit){\n        setResponsive(isBreakingPointWidth || isBreakingPointHeight);\n    }\n    else if(widthLimit){\n        setResponsive(isBreakingPointWidth);\n    }\n    else if(heightLimit){\n        setResponsive(isBreakingPointHeight);\n    }\n}\n\n/**\n* Turns fullPage.js to normal scrolling mode when the viewport `width` or `height`\n* are smaller than the set limit values.\n*/\nfunction setResponsive(active){\n    var isResponsive = isResponsiveMode();\n\n    if(active){\n        if(!isResponsive){\n            setAutoScrolling(false, 'internal');\n            setFitToSection(false, 'internal');\n            utils.hide(utils.$(SECTION_NAV_SEL));\n            utils.addClass($body, RESPONSIVE);\n            if(utils.isFunction( getOptions().afterResponsive )){\n                getOptions().afterResponsive.call( getContainer(), active);\n            }            \n        }\n    }\n    else if(isResponsive){\n        setAutoScrolling(getOriginals().autoScrolling, 'internal');\n        setFitToSection(getOriginals().autoScrolling, 'internal');\n        utils.show(utils.$(SECTION_NAV_SEL));\n        utils.removeClass($body, RESPONSIVE);\n        if(utils.isFunction( getOptions().afterResponsive )){\n            getOptions().afterResponsive.call( getContainer(), active);\n        }\n    }\n}\n\n/**\n* Determines whether fullpage.js is in responsive mode or not.\n*/\nexport function isResponsiveMode(){\n    return utils.hasClass($body, RESPONSIVE);\n}\n "
  },
  {
    "path": "src/js/scroll/index.js",
    "content": "import * as utils from '../common/utils.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { scrollHandler } from './scrollHandler.js';\nimport { scrollPageAndSlide } from './scrollPageAndSlide.js';\nimport { moveTo } from './moveTo.js';\nimport { moveSectionDown } from './moveSectionDown.js';\nimport { moveSectionUp } from './moveSectionUp.js';\nimport { scrollPage } from './scrollPage.js';\nimport { doc } from '../common/constants.js';\nimport { events } from '../common/events.js';\n\nEventEmitter.on(events.bindEvents, bindEvents);\nEventEmitter.on(events.onDestroy, onDestroy);\n\nfunction onDestroy(){\n    utils.windowRemoveEvent('scroll', scrollHandler);\n}\n\nfunction bindEvents(){\n    utils.windowAddEvent('scroll', scrollHandler);\n    doc.body.addEventListener('scroll', scrollHandler);\n\n    EventEmitter.on(events.onScrollPageAndSlide, function(params){\n        scrollPageAndSlide(params.sectionAnchor, params.slideAnchor);\n    });\n\n    EventEmitter.on(events.onMenuClick, function(params){\n        moveTo(params.anchor, undefined);\n    });\n\n    EventEmitter.on(events.onScrollOverflowScrolled, function(params){\n        var scrollSection = (params.direction === 'down') ? moveSectionDown : moveSectionUp;\n        scrollSection();\n    });\n\n    EventEmitter.on(events.scrollPage, function(params){\n        scrollPage(params.destination);\n    });\n}"
  },
  {
    "path": "src/js/scroll/moveSectionDown.js",
    "content": "import { getContainer, getOptions } from \"../common/options.js\";\nimport { getState } from \"../common/state.js\";\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { FP } from '../common/constants';\nimport { $body } from \"../common/cache.js\";\nimport { scrollPage } from \"./scrollPage.js\";\nimport { events } from \"../common/events.js\";\n\nFP.moveSectionDown = moveSectionDown;\n\n/**\n* Moves the page down one section.\n*/\nexport function moveSectionDown(){\n    var next = getState().activeSection.next();\n\n    //looping to the top if there's no more sections below\n    if(!next &&\n        (getOptions().loopBottom || getOptions().continuousVertical)){\n        next = getState().sections[0];\n    }\n\n    if(next != null){\n        scrollPage(next, null, false);\n    }\n    else if(hasContentBeyondFullPage()){\n        EventEmitter.emit(events.scrollBeyondFullpage);\n    }\n}\n\nfunction hasContentBeyondFullPage(){\n    return getContainer().scrollHeight < $body.scrollHeight && \n            getOptions().scrollBar &&\n            getOptions().scrollBeyondFullpage;\n}"
  },
  {
    "path": "src/js/scroll/moveSectionUp.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions } from \"../common/options.js\";\nimport { getState } from \"../common/state.js\";\nimport { FP } from '../common/constants';\nimport { scrollPage } from './scrollPage.js';\n\nFP.moveSectionUp = moveSectionUp;\n\n/**\n* Moves the page up one section.\n*/\nexport function moveSectionUp(){\n    var prev = getState().activeSection.prev();\n\n    //looping to the bottom if there's no more sections above\n    if (!prev && (getOptions().loopTop || getOptions().continuousVertical)) {\n        prev = utils.getLast(getState().sections);\n    }\n\n    if (prev != null) {\n        scrollPage(prev, null, true);\n    }\n}\n"
  },
  {
    "path": "src/js/scroll/moveTo.js",
    "content": "import { getSectionByAnchor } from \"../common/getSectionByAnchor.js\";\nimport { scrollPage } from \"./scrollPage.js\";\nimport { scrollPageAndSlide } from \"./scrollPageAndSlide.js\";\nimport { FP } from '../common/constants';\n\nFP.moveTo = moveTo;\n\n/**\n* Moves the page to the given section and slide.\n* Anchors or index positions can be used as params.\n*/\nexport function moveTo(sectionAnchor, slideAnchor){\n    var destiny = getSectionByAnchor(sectionAnchor);\n\n    if (typeof slideAnchor !== 'undefined'){\n        scrollPageAndSlide(sectionAnchor, slideAnchor);\n    }else if(destiny != null){\n        scrollPage(destiny);\n    }\n}"
  },
  {
    "path": "src/js/scroll/scrollHandler.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions } from '../common/options.js';\nimport { stopMedia, playMedia} from '../media.js';\nimport { updateState } from '../stateUpdates.js';\nimport { getState, setState, state } from '../common/state.js';\nimport { lazyLoadPanels } from '../lazyLoad/lazyLoad.js';\nimport { setPageStatus } from '../anchors/setPageStatus.js';\nimport { activateMenuAndNav } from '../menu/activateMenuAndNav.js';\nimport { $body } from '../common/cache.js';\nimport { getYmovement } from '../common/utilsFP.js';\nimport { \n    COMPLETELY,\n    ACTIVE\n} from '../common/selectors.js';\nimport { fireCallbackOncePerScroll } from '../callbacks/fireCallbacksOncePerScroll.js';\nimport { fireCallback } from '../callbacks/fireCallback.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { fitToSection } from '../fitToSection.js';\nimport { events } from '../common/events.js';\nimport { doc, isTouchDevice } from '../common/constants.js';\n\nvar lastScroll = 0;\nlet g_scrollId;\nlet g_scrollId2;\n\nEventEmitter.on(events.onDestroy, onDestroy);\n\n//when scrolling...\nexport function scrollHandler(e){\n    var currentSection;\n    var currentSectionElem;\n\n    if(state.isResizing || !getState().activeSection){\n        return;\n    }\n\n    var lastSection = utils.getLast(getState().sections);\n    if(getState().isBeyondFullpage || getState().isAboutToScrollToFullPage){\n        return;\n    }\n    \n    if(!getOptions().autoScrolling || getOptions().scrollBar){\n        var currentScroll = utils.getScrollTop();\n        var scrollDirection = getScrollDirection(currentScroll);\n        var visibleSectionIndex = 0;\n        var screen_mid = currentScroll + (utils.getWindowHeight() / 2.0);\n        var isAtBottom = $body.scrollHeight - utils.getWindowHeight() === currentScroll;\n        var sections =  getState().sections;\n        \n        setState({scrollY: currentScroll});\n\n        //when using `auto-height` for a small last section it won't be centered in the viewport\n        if(isAtBottom){\n            visibleSectionIndex = sections.length - 1;\n        }\n        //is at top? when using `auto-height` for a small first section it won't be centered in the viewport\n        else if(!currentScroll){\n            visibleSectionIndex = 0;\n        }\n\n        //taking the section which is showing more content in the viewport\n        else{\n            for (var i = 0; i < sections.length; ++i) {\n                var section = sections[i].item;\n\n                // Pick the the last section which passes the middle line of the screen.\n                if (section.offsetTop <= screen_mid)\n                {\n                    visibleSectionIndex = i;\n                }\n            }\n        }\n\n        if(isCompletelyInViewPort(scrollDirection)){\n            if(!utils.hasClass(getState().activeSection.item, COMPLETELY)){\n                utils.addClass(getState().activeSection.item, COMPLETELY);\n                utils.removeClass(utils.siblings(getState().activeSection.item), COMPLETELY);\n            }\n        }\n\n        //geting the last one, the current one on the screen\n        currentSection = sections[visibleSectionIndex];\n        currentSectionElem = currentSection.item;\n\n        //setting the visible section as active when manually scrolling\n        //executing only once the first time we reach the section\n        if(!currentSection.isActive){\n            setState({isScrolling: true});\n            var leavingSection = getState().activeSection.item;\n            var leavingSectionIndex = getState().activeSection.index() + 1;\n            var yMovement = getYmovement(getState().activeSection, currentSectionElem);\n            var anchorLink  = currentSection.anchor;\n            var sectionIndex = currentSection.index() + 1;\n            var activeSlide = currentSection.activeSlide;\n            var slideIndex;\n            var slideAnchorLink;\n            var callbacksParams = {\n                activeSection: leavingSection,\n                sectionIndex: sectionIndex -1,\n                anchorLink: anchorLink,\n                element: currentSectionElem,\n                leavingSection: leavingSectionIndex,\n                direction: yMovement,\n\n                items: {\n                    origin: getState().activeSection,\n                    destination: currentSection\n                }\n            };\n\n            if(activeSlide){\n                slideAnchorLink = activeSlide.anchor;\n                slideIndex = activeSlide.index();\n            }\n\n            if(state.canScroll){\n                utils.addClass(currentSectionElem, ACTIVE);\n                utils.removeClass(utils.siblings(currentSectionElem), ACTIVE);\n\n                if(utils.isFunction( getOptions().beforeLeave )){\n                    fireCallbackOncePerScroll('beforeLeave', callbacksParams);\n                }\n\n                if(utils.isFunction( getOptions().onLeave )){\n                    fireCallback('onLeave', callbacksParams);\n                }\n                if(utils.isFunction( getOptions().afterLoad )){\n                    fireCallback('afterLoad', callbacksParams);\n                }\n\n                stopMedia(leavingSection);\n                lazyLoadPanels(currentSection);\n                playMedia(currentSectionElem);\n\n                activateMenuAndNav(anchorLink, sectionIndex - 1);\n\n                if(getOptions().anchors.length){\n                    //needed to enter in hashChange event when using the menu with anchor links\n                    setState({lastScrolledDestiny: anchorLink});\n                }\n                updateState();\n                setPageStatus(slideIndex, slideAnchorLink, anchorLink);\n            }\n\n            //small timeout in order to avoid entering in hashChange event when scrolling is not finished yet\n            clearTimeout(g_scrollId);\n            g_scrollId = setTimeout(function(){\n                setState({isScrolling: false});\n            }, 100);\n\n        }\n\n        if(getOptions().fitToSection && state.canScroll){\n\n            clearTimeout(g_scrollId2);\n            g_scrollId2 = setTimeout(function(){\n\n                var fixedSections = state.sections.filter(function(section){\n                    var sectionValues = section.item.getBoundingClientRect();\n                    return Math.round(sectionValues.bottom) === Math.round(utils.getWindowHeight()) ||\n                        Math.round(sectionValues.top) === 0;\n                });\n\n                // No section is fitting the viewport? Let's fix that!\n                if(!fixedSections.length){\n\n                    if(isTouchDevice && isFormElementFocused()){\n                        // Exit early to avoid fixing the section while interacting with form elements\n                        return; \n                    }\n                    else{\n                        fitToSection();\n                    }\n                }\n            }, getOptions().fitToSectionDelay);   \n        }\n    }\n}\n\nfunction isFormElementFocused() {\n    var focusedElement = document.activeElement;\n    if (!focusedElement) return false;\n\n    // Include only elements that trigger the keyboard on mobile\n    return focusedElement.matches('input, textarea');\n}\n\nfunction onDestroy(){\n    clearTimeout(g_scrollId);\n    clearTimeout(g_scrollId2);\n}\n\n/**\n* Gets the directon of the the scrolling fired by the scroll event.\n*/\nfunction getScrollDirection(currentScroll){\n    var direction = currentScroll > lastScroll ? 'down' : 'up';\n\n    lastScroll = currentScroll;\n\n    //needed for auto-height sections to determine if we want to scroll to the top or bottom of the destination\n    setState({previousDestTop: currentScroll});\n\n    return direction;\n}\n\n\n\n/**\n* Determines whether the active section has seen in its whole or not.\n*/\nfunction isCompletelyInViewPort(movement){\n    var top = getState().activeSection.item.offsetTop;\n    var bottom = top + utils.getWindowHeight();\n\n    if(movement == 'up'){\n        return bottom >= (utils.getScrollTop() + utils.getWindowHeight());\n    }\n    return top <= utils.getScrollTop();\n}\n"
  },
  {
    "path": "src/js/scroll/scrollPage.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions, getOriginals, setOption, setVariableState } from '../common/options.js';\nimport { getState, setState, state } from '../common/state.js';\nimport { doc, FP } from '../common/constants.js';\nimport { $html, $htmlBody } from '../common/cache.js';\nimport { transformContainer } from '../common/transformContainer.js';\nimport { scrollTo } from '../common/scrollTo.js';\nimport { getScrollSettings, getYmovement } from '../common/utilsFP.js';\nimport { createInfiniteSections } from '../infiniteScroll/createInfiniteSections.js';\nimport { continuousVerticalFixSectionOrder } from '../infiniteScroll/fixPosition.js';\nimport { stopMedia, playMedia} from '../media.js';\nimport { updateState } from '../stateUpdates.js';\nimport { lazyLoadPanels } from '../lazyLoad/lazyLoad.js';\nimport { lazyLoadOthers } from '../lazyLoad/lazyLoadOthers.js';\nimport { scrollOverflowHandler } from '../scrolloverflow.js';\nimport { setPageStatus } from '../anchors/setPageStatus.js';\nimport { activateMenuAndNav } from '../menu/activateMenuAndNav.js';\nimport { \n    AUTO_HEIGHT,\n    COMPLETELY,\n    ACTIVE,\n    SECTION_ACTIVE_SEL\n} from '../common/selectors.js';\nimport { fireCallbackOncePerScroll } from '../callbacks/fireCallbacksOncePerScroll.js';\nimport { fireCallback } from '../callbacks/fireCallback.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { events } from '../common/events.js';\n\nFP.moveTo = moveTo;\nFP.getScrollY = function(){\n    return state.scrollY;\n};\n\nlet g_afterSectionLoadsId;\nlet g_transitionLapseId;\n\nEventEmitter.on(events.onDestroy, onDestroy);\n\n/**\n* Scrolls the site to the given element and scrolls to the slide if a callback is given.\n*/\nexport function scrollPage(section, callback, isMovementUp){\n    var element = section.item;\n    if(element == null){ return; } //there's no element to scroll, leaving the function\n\n    var dtop = getDestinationPosition(element);\n    var slideAnchorLink;\n    var slideIndex;\n\n    //local variables\n    var v = {\n        \"element\": element,\n        \"callback\": callback,\n        \"isMovementUp\": isMovementUp,\n        \"dtop\": dtop,\n        \"yMovement\": getYmovement(getState().activeSection, element),\n        \"anchorLink\": section.anchor,\n        \"sectionIndex\": section.index(),\n        \"activeSlide\": section.activeSlide ? section.activeSlide.item : null,\n        \"leavingSection\": getState().activeSection.index() + 1,\n\n        //caching the value of isResizing at the momment the function is called\n        //because it will be checked later inside a setTimeout and the value might change\n        \"localIsResizing\": state.isResizing,\n\n        \"items\": {\n            \"origin\": getState().activeSection,\n            \"destination\": section\n        },\n        \"direction\": null\n    };\n\n    //quiting when destination scroll is the same as the current one\n    if((getState().activeSection.item == element && !state.isResizing) || (getOptions().scrollBar && utils.getScrollTop() === v.dtop && !utils.hasClass(element, AUTO_HEIGHT) )){ \n        return; \n    }\n\n    if(v.activeSlide != null){\n        slideAnchorLink = utils.getAttr(v.activeSlide, 'data-anchor');\n        slideIndex = utils.index(v.activeSlide, null);\n    }\n\n    //callback (onLeave) if the site is not just resizing and readjusting the slides\n    if(!v.localIsResizing){\n        var direction = v.yMovement;\n\n        //required for continousVertical\n        if(typeof isMovementUp !== 'undefined'){\n            direction = isMovementUp ? 'up' : 'down';\n        }\n\n        //for the callback\n        v.direction = direction;\n\n        if(utils.isFunction( getOptions().beforeLeave )){\n            \n            if(fireCallbackOncePerScroll('beforeLeave', v) === false){\n                return;\n            }\n        }\n\n        if(utils.isFunction(getOptions().onLeave)){\n            if(!fireCallback('onLeave', v)){\n                return;\n            }\n        }\n    }\n\n    // If continuousVertical && we need to wrap around\n    if (getOptions().autoScrolling && getOptions().continuousVertical && typeof (v.isMovementUp) !== \"undefined\" &&\n        ((!v.isMovementUp && v.yMovement == 'up') || // Intending to scroll down but about to go up or\n        (v.isMovementUp && v.yMovement == 'down'))) { // intending to scroll up but about to go down\n\n        v = createInfiniteSections(v);\n    }\n\n    //pausing media of the leaving section (if we are not just resizing, as destinatino will be the same one)\n    if(!v.localIsResizing){\n        stopMedia(getState().activeSection.item);\n    }\n\n    utils.addClass(element, ACTIVE);\n    utils.removeClass(utils.siblings(element), ACTIVE);\n    updateState();\n    lazyLoadPanels(section);\n\n    //preventing from activating the MouseWheelHandler event\n    //more than once if the page is scrolling\n    setState({canScroll: false || FP.test.isTesting});\n\n    setPageStatus(slideIndex, slideAnchorLink, v.anchorLink);\n\n    EventEmitter.emit(events.onLeave, v);\n\n    performMovement(v);\n\n    //flag to avoid callingn `scrollPage()` twice in case of using anchor links\n    setState({lastScrolledDestiny: v.anchorLink});\n\n    //avoid firing it twice (as it does also on scroll)\n    activateMenuAndNav(v.anchorLink, v.sectionIndex);\n}\n\nfunction onDestroy(){\n    clearTimeout(g_afterSectionLoadsId);\n    clearTimeout(g_transitionLapseId);\n}\n\n\n/**\n* Returns the destination Y position based on the scrolling direction and\n* the height of the section.\n*/\nexport function getDestinationPosition(element){\n    var elementHeight = element.offsetHeight;\n    var elementTop = element.offsetTop;\n\n    //top of the desination will be at the top of the viewport\n    var position = elementTop;\n    var isScrollingDown =  elementTop > state.previousDestTop;\n    var sectionBottom = position - utils.getWindowHeight() + elementHeight;\n    var bigSectionsDestination = getOptions().bigSectionsDestination;\n\n    //is the destination element bigger than the viewport?\n    if(elementHeight > utils.getWindowHeight()){\n        //scrolling up?\n        if(!isScrollingDown && !bigSectionsDestination || bigSectionsDestination === 'bottom' ){\n            position = sectionBottom;\n        }\n    }\n\n    //sections equal or smaller than the viewport height && scrolling down? ||  is resizing and its in the last section\n    else if(isScrollingDown || (state.isResizing && utils.next(element) == null) ){\n        //The bottom of the destination will be at the bottom of the viewport\n        position = sectionBottom;\n    }\n\n    /*\n    Keeping record of the last scrolled position to determine the scrolling direction.\n    No conventional methods can be used as the scroll bar might not be present\n    AND the section might not be active if it is auto-height and didnt reach the middle\n    of the viewport.\n    */\n    setState({previousDestTop: position});\n    return position;\n}\n\n/**\n* Performs the vertical movement (by CSS3 or by jQuery)\n*/\nfunction performMovement(v){\n    setState({\n        touchDirection: 'none',\n        scrollY: Math.round(v.dtop)\n    });\n\n    EventEmitter.emit(events.onPerformMovement, v);\n\n    var isFastSpeed = getOptions().scrollingSpeed < 700;\n    var transitionLapse = isFastSpeed ? 700 : getOptions().scrollingSpeed; \n    \n    // using CSS3 translate functionality\n    if (getOptions().css3 && getOptions().autoScrolling && !getOptions().scrollBar) {\n\n        // The first section can have a negative value in iOS 10. Not quite sure why: -0.0142822265625\n        // that's why we round it to 0.\n        var translate3d = 'translate3d(0px, -' + Math.round(v.dtop) + 'px, 0px)';\n        transformContainer(translate3d, true);\n\n        //even when the scrollingSpeed is 0 there's a little delay, which might cause the\n        //scrollingSpeed to change in case of using silentMoveTo();ç\n        if(getOptions().scrollingSpeed){\n            clearTimeout(g_afterSectionLoadsId);\n            g_afterSectionLoadsId = setTimeout(function () {\n                afterSectionLoads(v);\n\n                //disabling canScroll when using fastSpeed\n                setState({canScroll: !isFastSpeed || FP.test.isTesting});\n            }, getOptions().scrollingSpeed);                   \n        }else{\n            afterSectionLoads(v);\n        }\n    }\n\n    // using JS to animate\n    else{\n        var scrollSettings = getScrollSettings(v.dtop);\n        FP.test.top = -v.dtop + 'px';\n\n        clearTimeout(g_afterSectionLoadsId);\n\n        scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function(){\n            if(getOptions().scrollBar){\n\n                /* Hack!\n                The timeout prevents setting the most dominant section in the viewport as \"active\" when the user\n                scrolled to a smaller section by using the mousewheel (auto scrolling) rather than draging the scroll bar.\n\n                When using scrollBar:true It seems like the scroll events still getting propagated even after the scrolling animation has finished.\n                */\n                g_afterSectionLoadsId = setTimeout(function(){\n                    afterSectionLoads(v);\n                },30);\n            }else{\n                \n                afterSectionLoads(v);\n\n                //disabling canScroll when using fastSpeed\n                setState({canScroll: !isFastSpeed || FP.test.isTesting});\n            }\n        });\n    }\n\n    // enabling canScroll after the minimum transition laps\n    if(isFastSpeed){\n        clearTimeout(g_transitionLapseId);\n        g_transitionLapseId = setTimeout(function(){\n            setState({canScroll: true});\n        }, transitionLapse);\n    }\n}\n\n/**\n* Actions to do once the section is loaded.\n*/\nfunction afterSectionLoads(v){    \n    setState({isBeyondFullpage: false});\n    continuousVerticalFixSectionOrder(v);\n\n    //callback (afterLoad) if the site is not just resizing and readjusting the slides\n    if(utils.isFunction(getOptions().afterLoad) && !v.localIsResizing){\n        fireCallback('afterLoad', v);\n    }\n\n    updateState();\n\n    if(!v.localIsResizing){\n        playMedia(v.element);\n    }\n\n    utils.addClass(v.element, COMPLETELY);\n    utils.removeClass(utils.siblings(v.element), COMPLETELY);\n\n    lazyLoadOthers();\n\n    setState({canScroll: true});\n\n    EventEmitter.emit(events.afterSectionLoads, v);\n\n    if(utils.isFunction(v.callback)){\n        v.callback();\n    }\n}\n"
  },
  {
    "path": "src/js/scroll/scrollPageAndSlide.js",
    "content": "import * as utils from '../common/utils.js';\nimport { state } from '../common/state.js';\nimport { scrollSlider } from '../slides/scrollSlider.js';\nimport { getSectionByAnchor } from '../common/getSectionByAnchor.js';\nimport { ACTIVE } from '../common/selectors.js';\nimport { scrollPage } from './scrollPage.js';\n\n/**\n* Scrolls to the given section and slide anchors\n*/\nexport function scrollPageAndSlide(sectionAnchor, slideAnchor){\n    var section = getSectionByAnchor(sectionAnchor);\n\n    //do nothing if there's no section with the given anchor name\n    if(section == null) return;\n\n    var slideElem = getSlideByAnchor(slideAnchor, section);\n\n    //we need to scroll to the section and then to the slide\n    if ((!section.anchor || section.anchor !== state.lastScrolledDestiny) && !utils.hasClass(section.item, ACTIVE)){\n        \n        scrollPage(section, function(){\n            scrollSlider(slideElem);\n        });\n    }\n    //if we were already in the section\n    else{\n        scrollSlider(slideElem);\n    }\n}\n\n/**\n* Gets a slide inside a given section by its anchor / index\n*/\nfunction getSlideByAnchor(slideAnchor, section){\n    var slide = section.slides.filter(slide => slide.anchor === slideAnchor)[0];\n    if(slide == null){\n        slideAnchor = typeof slideAnchor !== 'undefined' ? slideAnchor : 0;\n        slide = section.slides[slideAnchor];\n    }\n\n    return slide ? slide.item : null;\n}"
  },
  {
    "path": "src/js/scroll/scrollToAnchor.js",
    "content": "import { getOptions } from '../common/options.js';\nimport { getAnchorsURL } from '../anchors/getAnchorsURL.js';\nimport { scrollPageAndSlide } from './scrollPageAndSlide.js';\nimport { silentMoveTo } from './silentMove.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { events } from '../common/events.js';\n\n/**\n* Scrolls to the anchor in the URL when loading the site\n*/\nexport function scrollToAnchor(){\n    var anchors = getAnchorsURL();\n    var sectionAnchor = anchors.section;\n    var slideAnchor = anchors.slide;\n\n    if(sectionAnchor){  //if theres any #\n        if(getOptions().animateAnchor){\n            scrollPageAndSlide(sectionAnchor, slideAnchor);\n        }else{\n            silentMoveTo(sectionAnchor, slideAnchor);\n        }\n    }else{\n        EventEmitter.emit(events.onAfterRenderNoAnchor, null);\n    }\n}"
  },
  {
    "path": "src/js/scroll/scrolling.js",
    "content": "import { getIsScrollAllowed } from \"../common/isScrollAllowed.js\";\nimport { getOptions } from \"../common/options.js\";\nimport { getState } from \"../common/state.js\";\nimport { scrollOverflowHandler } from \"../scrolloverflow.js\";\nimport { moveSectionDown } from \"./moveSectionDown.js\";\nimport { moveSectionUp } from \"./moveSectionUp.js\";\n\n/**\n* Determines the way of scrolling up or down:\n* by 'automatically' scrolling a section or by using the default and normal scrolling.\n*/\nexport function scrolling(type){\n    if (!getIsScrollAllowed().m[type]){\n        return;\n    }\n\n    var scrollSection = (type === 'down') ? moveSectionDown : moveSectionUp;\n\n    if(getOptions().scrollOverflow && scrollOverflowHandler.isScrollable(getState().activeSection)){\n\n        //is the scrollbar at the start/end of the scroll?\n        if(scrollOverflowHandler.isScrolled(type, getState().activeSection.item) && \n            scrollOverflowHandler.shouldMovePage()\n        ){\n            scrollSection();\n        }\n    }\n    else{\n        scrollSection();\n    }\n}"
  },
  {
    "path": "src/js/scroll/setAllowScrolling.js",
    "content": "import { setIsScrollAllowed } from \"../common/isScrollAllowed.js\";\nimport { FP } from '../common/constants';\n\nFP.setAllowScrolling = setAllowScrolling;\n\n/**\n* Adds or remove the possibility of scrolling through sections by using the mouse wheel/trackpad or touch gestures.\n* Optionally a second parameter can be used to specify the direction for which the action will be applied.\n*\n* @param directions string containing the direction or directions separated by comma.\n*/\nexport function setAllowScrolling(value, directions){\n    if(typeof directions !== 'undefined'){\n        directions = directions.replace(/ /g,'').split(',');\n\n        directions.forEach(function (direction){\n            setIsScrollAllowed(value, direction, 'm');\n        });\n    }\n    else{\n        setIsScrollAllowed(value, 'all', 'm');\n    }\n}"
  },
  {
    "path": "src/js/scroll/silentMove.js",
    "content": "import { getOriginals } from \"../common/options.js\";\nimport { setScrollingSpeed } from \"../speed.js\";\nimport { FP } from '../common/constants';\nimport { moveTo } from './moveTo.js';\n\nFP.silentMoveTo = silentMoveTo;\n\n/**\n* Moves the page to the given section and slide with no animation.\n* Anchors or index positions can be used as params.\n*/\nexport function silentMoveTo(sectionAnchor, slideAnchor){\n    setScrollingSpeed (0, 'internal');\n    moveTo(sectionAnchor, slideAnchor);\n    setScrollingSpeed (getOriginals().scrollingSpeed, 'internal');\n}\n"
  },
  {
    "path": "src/js/scroll/skipIntermediateItems.js",
    "content": "import { EventEmitter } from '../common/eventEmitter.js';\nimport { events } from '../common/events.js';\nimport { getOptions, getOriginals, setVariableState } from '../common/options.js';\nimport { setScrollingSpeed } from '../speed.js';\n\nEventEmitter.on(events.onPerformMovement, onSlideOrScroll);\nEventEmitter.on(events.afterSectionLoads, afterPanelLoad);\nEventEmitter.on(events.onSlideLeave, onSlideOrScroll);\nEventEmitter.on(events.afterSlideLoads, afterPanelLoad);\n\nfunction onSlideOrScroll(params){\n    var skipValue = getOptions().skipIntermediateItems;\n    var scrollType = params.items.origin.isSection ? 'sections' : 'slides';\n    var areConsecutivePanels = Math.abs(params.items.origin.index() - params.items.destination.index()) > 1;\n    var doesApply = (skipValue === true ||  skipValue === scrollType) && areConsecutivePanels;\n\n    if(doesApply){\n        setScrollingSpeed (0, 'internal');\n    }\n}\n\nfunction afterPanelLoad(params){\n    if(getOptions().skipIntermediateItems){\n        setVariableState('scrollingSpeed', getOriginals().scrollingSpeed, 'internal');\n    }\n}"
  },
  {
    "path": "src/js/scrolloverflow.js",
    "content": "import * as utils from './common/utils.js';\nimport { getOptions } from './common/options.js';\nimport { getState, state } from './common/state.js';\nimport { fireCallback } from './callbacks/fireCallback.js';\nimport { isResponsiveMode } from './responsive.js';\nimport { isMacDevice, isTouchDevice, isTouch, win, doc, isIE11, isInsideIframe } from './common/constants.js';\nimport { $body } from './common/cache.js';\nimport { \n    AUTO_HEIGHT_RESPONSIVE,\n    IS_OVERFLOW,\n    OVERFLOW,\n    OVERFLOW_SEL\n} from './common/selectors.js';\nimport { EventEmitter } from './common/eventEmitter.js';\nimport { getSlideOrSection } from './common/utilsFP.js';\nimport { getSectionFromPanel } from './sections.js';\nimport { events } from './common/events.js';\nimport { isInsideInput } from './common/utils.js';\n\nlet g_focusScrollableId;\n\nEventEmitter.on(events.bindEvents, bindEvents);\n\nfunction bindEvents(){\n    // We can't focus scrollOverflow before scrolling\n    // to the anchor (if we need to)\n    EventEmitter.on(events.onAfterRenderNoAnchor, afterRender);\n\n    EventEmitter.on(events.onLeave, scrollOverflowHandler.onLeave);\n    EventEmitter.on(events.onSlideLeave, scrollOverflowHandler.onLeave);\n    EventEmitter.on(events.afterSlideLoads, scrollOverflowHandler.afterLoad);\n    EventEmitter.on(events.afterSectionLoads, scrollOverflowHandler.afterLoad);\n    EventEmitter.on(events.onDestroy, onDestroy);\n\n    utils.docAddEvent('keyup', scrollOverflowHandler.keyUpHandler);\n}\n\nfunction afterRender(){\n    if(getOptions().scrollOverflow && !getOptions().scrollBar){\n        scrollOverflowHandler.makeScrollable();\n        scrollOverflowHandler.focusScrollable();\n    }\n}\n\nfunction onDestroy(){\n    EventEmitter.removeListener(events.onAfterRenderNoAnchor, afterRender);\n    utils.docRemoveEvent('keyup', scrollOverflowHandler.keyUpHandler);\n}\n\nexport const scrollOverflowHandler = {\n    focusedElem: null,\n\n    shouldFocusScrollable: true,\n\n    isInnerScrollAllowed: true,\n\n    timeBeforeReachingLimit: null,\n\n    timeLastScroll: null,\n\n    preventScrollWithMouseWheel: function(e){\n        var activeSection = getState().activeSection;\n\n        if(!state.canScroll || (\n            isInsideIframe()\n            && getOptions().scrollOverflow \n            && scrollOverflowHandler.isScrollable(activeSection)\n            && scrollOverflowHandler.isScrolled(getState().wheelDirection, activeSection.item)\n        )){\n            utils.preventDefault(e);\n            return false;\n        }\n    },\n\n    preventScrollWithKeyboard: function(e){\n        if( !isInsideInput() && getOptions().keyboardScrolling ){\n            var directionKeys = [38, 33, 32, 40, 34, 36, 35];\n            if( directionKeys.indexOf(e.keyCode) > -1 && !scrollOverflowHandler.isInnerScrollAllowed){\n                utils.preventDefault(e);\n                return false;\n            }\n        }\n    },\n\n    keyUpHandler: function(){\n        scrollOverflowHandler.shouldFocusScrollable = state.canScroll;\n    },\n\n    // Leaving sections or slides\n    onLeave: function(){\n        clearTimeout(g_focusScrollableId);\n        scrollOverflowHandler.isInnerScrollAllowed = false;\n    },\n\n    // Loading sections or slides\n    afterLoad: function(){\n        scrollOverflowHandler.isInnerScrollAllowed = false;\n\n        // Delaying it to avoid issues on Safari when focusing elements #4484 & #4493\n        clearTimeout(g_focusScrollableId);\n        g_focusScrollableId = setTimeout(function(){\n            scrollOverflowHandler.shouldFocusScrollable = state.canScroll;\n        }, 200);\n    },\n\n    // Unfocusing the scrollable element from the orgin section/slide\n    unfocusScrollable: function(){\n         if( doc.activeElement === this.focusedElem){\n            // @ts-ignore\n            this.focusedElem.blur();\n\n            scrollOverflowHandler.isInnerScrollAllowed = false;\n        }\n    },\n\n    focusScrollable: function(){\n\n        if(!getOptions().scrollOverflow || !scrollOverflowHandler.shouldFocusScrollable){\n            return;\n        }\n        \n        scrollOverflowHandler.unfocusScrollable();\n       \n        var scrollableItem = scrollOverflowHandler.getScrollableItem(getState().activeSection.item);\n\n        // On desktop we focus the scrollable to be able to use the mouse wheel\n        // We avoid it on mobile due to a bug in iOS Safari\n        if( scrollableItem && !isTouchDevice && !isTouch){\n            this.focusedElem = scrollableItem;\n\n            // Forcing the focus on the next paint \n            // to avoid issue #4484 & #4493 on Safari\n            requestAnimationFrame(function(){\n                scrollableItem.focus({preventScroll: true});\n                scrollOverflowHandler.isInnerScrollAllowed = true;\n            });\n        }\n\n        scrollOverflowHandler.shouldFocusScrollable = false;\n    },\n\n    makeScrollable: function(){\n        if(getOptions().scrollOverflowMacStyle && !isMacDevice){\n            utils.addClass($body, 'fp-scroll-mac');\n        }\n        \n        getState().panels.forEach(function(el){\n            if(el.slides && el.slides.length){\n                return;\n            }\n            if(\n                utils.hasClass(el.item, AUTO_HEIGHT_RESPONSIVE) && isResponsiveMode()\n            ){\n                return;\n            }else{\n                let item = getSlideOrSection(el.item);\n                const shouldBeScrollable = scrollOverflowHandler.shouldBeScrollable(el.item);\n                var section = getSectionFromPanel(el);\n\n                if(isIE11){\n                    var toggleAction = shouldBeScrollable ? 'addClass' : 'removeClass';\n                    utils[toggleAction](section.item, IS_OVERFLOW); \n                    utils[toggleAction](el.item, IS_OVERFLOW);  \n                }\n                else{\n                    utils.addClass(section.item, IS_OVERFLOW); \n                    utils.addClass(el.item, IS_OVERFLOW);  \n                }\n                \n                if(!el.hasScroll){\n                    scrollOverflowHandler.createWrapper(item);\n                    scrollOverflowHandler.bindEvents(item);\n                }\n\n                // updating the state now in case \n                // this is executed on page load (after images load)\n                el.hasScroll = true;\n            }\n        });\n    },\n\n    bindEvents: function(item){\n        var scrollable = scrollOverflowHandler.getScrollableItem(item);\n        if(scrollable){\n            scrollable.addEventListener('scroll', scrollOverflowHandler.onPanelScroll);\n        }\n        item.addEventListener('wheel', scrollOverflowHandler.preventScrollWithMouseWheel, {passive: false});\n        item.addEventListener('keydown', scrollOverflowHandler.preventScrollWithKeyboard, {passive: false});\n    },\n\n    unbindEvents: function(item){\n        var scrollable = scrollOverflowHandler.getScrollableItem(item);\n        if(scrollable){\n            scrollable.removeEventListener('scroll', scrollOverflowHandler.onPanelScroll);\n        }\n        item.removeEventListener('wheel', scrollOverflowHandler.preventScrollWithMouseWheel, {passive: false});\n        item.removeEventListener('keydown', scrollOverflowHandler.preventScrollWithKeyboard, {passive: false});\n    },\n\n    createWrapper: function(item){\n        var overflowWrapper = document.createElement('div');\n        overflowWrapper.className = OVERFLOW;\n\n        utils.wrapInner(item, overflowWrapper);\n        overflowWrapper.setAttribute('tabindex', '-1');\n    },\n\n    destroyScrollable: function(panel){\n        if(panel.slides && panel.slides.length){\n            return;\n        }\n        \n        if(panel.hasScroll){\n            scrollOverflowHandler.destroyWrapper(panel.item);\n            scrollOverflowHandler.unbindEvents(panel.item);\n            \n            panel.hasScroll = false;\n        }\n    },\n\n    destroyWrapper: function(item){\n        var overflowWrapper = utils.$(OVERFLOW_SEL, item)[0];\n        if(overflowWrapper){\n            utils.unwrap(overflowWrapper);\n            item.removeAttribute('tabindex');\n        }\n    },\n\n    getScrollableItem: function(sectionItem){\n        var panel = getSlideOrSection(sectionItem);\n\n        return utils.$(OVERFLOW_SEL, panel)[0] || panel;\n    },\n\n    hasScroll: function(panelItem){\n        return utils.hasClass(panelItem, OVERFLOW) || utils.$(OVERFLOW_SEL, panelItem)[0] != null;\n    },\n\n    isScrollable: function(panel){\n        return panel.isSection && panel.activeSlide ? panel.activeSlide.hasScroll : panel.hasScroll;\n    },\n\n    shouldBeScrollable: function(item){\n        var scrollable = scrollOverflowHandler.getScrollableItem(item);\n        return scrollable.scrollHeight > win.innerHeight;\n    },\n\n    isScrolled: function(direction, el){\n        if(!state.canScroll){\n            return false;\n        }\n\n        // we won't allow scrolloverflow on scrollBar:true\n        if(getOptions().scrollBar){\n            return true;\n        }\n\n        var scrollableItem = scrollOverflowHandler.getScrollableItem(el);\n\n        if(!getOptions().scrollOverflow || \n            !utils.hasClass(scrollableItem, OVERFLOW) ||\n\n            // Checking the section first \n            // In case they apply to both section + slide #4505\n            utils.hasClass(el, 'fp-noscroll') || \n\n            // Checking the slide (in case it has)\n            utils.hasClass(getSlideOrSection(el), 'fp-noscroll')\n        ){\n            return true;\n        }\n        \n        // ie11 wrongly calculates scrollHeight when using the CSS style\n        // overflow: auto   It adds 1 more pixel compared to offsetHeight\n        var ie11offset = isIE11 ? 1 : 0;\n\n        var positionY = scrollableItem.scrollTop;\n        var isTopReached = direction === 'up' && positionY <=0;\n        var isBottomReached = direction === 'down' && scrollableItem.scrollHeight <= Math.ceil(scrollableItem.offsetHeight + positionY) + ie11offset;\n        var isScrolled = isTopReached || isBottomReached;\n\n        if(!isScrolled && direction !== 'none'){\n            this.timeBeforeReachingLimit = new Date().getTime();\n        }\n        return isScrolled;\n    },\n\n    shouldMovePage: function(){\n        this.timeLastScroll = new Date().getTime();\n        var timeDiff = this.timeLastScroll - scrollOverflowHandler.timeBeforeReachingLimit;\n        var isUsingTouch = isTouchDevice || isTouch;\n        var isGrabbing = isUsingTouch && state.isGrabbing;\n        var isNotFirstTimeReachingLimit = state.isUsingWheel && timeDiff > 600;\n\n        return isGrabbing && timeDiff > 400 || isNotFirstTimeReachingLimit;\n    },\n    onPanelScroll: (function(){\n        var prevPosition = 0;\n\n        return function(e){\n            var currentPosition = e.target.scrollTop;\n            var direction = state.touchDirection !== 'none' ? state.touchDirection : prevPosition < currentPosition ? 'down' : 'up';\n            prevPosition = currentPosition;\n            \n            if(utils.isFunction(getOptions().onScrollOverflow) ){\n                fireCallback('onScrollOverflow', {\n                    position: currentPosition,\n                    direction: direction\n                });\n            }\n\n            if(utils.hasClass(e.target, OVERFLOW) && state.canScroll){\n                if(\n                    scrollOverflowHandler.isScrolled(direction, e.target) &&\n                    scrollOverflowHandler.shouldMovePage()\n                ){\n                    // Checking again if we have a scrollable content\n                    // To avoid issues like #4479 where the scroll event gets\n                    // triggered after removing/hidding content if this was scrolled\n                    if(scrollOverflowHandler.shouldBeScrollable(getState().activeSection.item)){\n\n                        EventEmitter.emit(events.onScrollOverflowScrolled, {\n                            direction: direction\n                        });\n                    }\n                }\n            }\n        };\n    })()\n};"
  },
  {
    "path": "src/js/sections.js",
    "content": "import * as utils from './common/utils.js';\nimport { getOptions } from \"./common/options.js\";\nimport { ACTIVE } from './common/selectors.js';\nimport { updateState } from './stateUpdates.js';\nimport { getState } from './common/state.js';\nimport { FP } from './common/constants.js';\nimport { addTableClass } from './common/addTableClass.js';\n\nlet startingSection = null;\nFP.getActiveSection = getActiveSection;\n\nexport function getStartingSection(){\n    return startingSection;\n}\n\n/**\n* Styling vertical sections\n*/\nexport function styleSection(section){\n    var sectionElem = section.item;\n    var hasSlides = section.allSlidesItems.length;\n    var index = section.index();\n\n    //if no active section is defined, the 1st one will be the default one\n    if(!getState().activeSection && section.isVisible) {\n        utils.addClass(sectionElem, ACTIVE);\n        updateState();\n    }\n\n    if(!startingSection && section.isVisible){\n        startingSection = getState().activeSection.item;\n    }\n\n    if(getOptions().paddingTop){\n        utils.css(sectionElem, {'padding-top': getOptions().paddingTop});\n    }\n\n    if(getOptions().paddingBottom){\n        utils.css(sectionElem, {'padding-bottom': getOptions().paddingBottom});\n    }\n\n    if (typeof getOptions().sectionsColor[index] !==  'undefined') {\n        utils.css(sectionElem, {'background-color': getOptions().sectionsColor[index]});\n    }\n\n    if (typeof getOptions().anchors[index] !== 'undefined') {\n        sectionElem.setAttribute('data-anchor', section.anchor);\n    }\n\n    if(!hasSlides){\n        addTableClass(section);\n    }\n}\n\n/**\n* Gets the active section.\n*/\nfunction getActiveSection(){\n    return getState().activeSection;\n}\n\nexport function getSectionFromPanel(panel){\n    return panel.isSection ? panel : panel.parent;\n}"
  },
  {
    "path": "src/js/slides/index.js",
    "content": "import { nullOrSlide } from '../callbacks/nullOrSlide.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { getState, setState, state } from '../common/state.js';\nimport { landscapeScroll, onDestroy } from './landscapeScroll.js';\nimport { moveSlideLeft, moveSlideRight } from './moveSlide.js';\nimport { FP } from '../common/constants.js';\nimport { events } from '../common/events.js';\n\nFP.getActiveSlide = getActiveSlide;\nFP.getScrollX = function(){\n    return state.scrollX;\n};\n\nEventEmitter.on(events.bindEvents, bindEvents);\n\nfunction bindEvents(){\n    EventEmitter.on(events.onDestroy, onDestroy);\n\n    EventEmitter.on(events.landscapeScroll, function(params){\n        landscapeScroll(params.slides, params.destination);\n    });\n    EventEmitter.on(events.moveSlideRight, function(params){\n        moveSlideRight(params.section);\n    });\n    EventEmitter.on(events.moveSlideLeft, function(params){\n        moveSlideLeft(params.section);\n    });\n    EventEmitter.on(events.afterSectionLoads, updateScrollX);\n}\n\nfunction updateScrollX(params){\n    var activeSlide = params.items.destination.activeSlide;\n    var scrollX = activeSlide ? Math.round(activeSlide.offsetLeft) : 0;\n    \n    setState({\n        scrollX: scrollX\n    });\n}\n\n/**\n* Gets the active slide.\n*/\nexport function getActiveSlide(){\n    return nullOrSlide(getState().activeSection.activeSlide);\n}\n"
  },
  {
    "path": "src/js/slides/landscapeScroll.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions } from '../common/options.js';\nimport { getState, setState, state } from '../common/state.js';\nimport { scrollTo } from '../common/scrollTo.js';\nimport { FP } from '../common/constants.js';\nimport { addAnimation, getTransforms } from '../common/utilsFP.js';\nimport {\n    SECTION_SEL,\n    SLIDES_NAV_SEL,\n    SLIDES_CONTAINER_SEL,\n    ACTIVE\n} from '../common/selectors.js';\nimport { fireCallback } from '../callbacks/fireCallback.js';\nimport { updateState } from '../stateUpdates.js';\nimport { playMedia, stopMedia } from '../media.js';\nimport { lazyLoadPanels } from '../lazyLoad/lazyLoad.js';\nimport { setPageStatus } from '../anchors/setPageStatus.js';\nimport { activeSlidesNavigation } from '../nav/slides.js';\nimport { toggleControlArrows } from '../arrows.js';\nimport { EventEmitter } from '../common/eventEmitter.js';\nimport { events } from '../common/events.js';\nimport { scrollOverflowHandler } from '../scrolloverflow.js';\n\nlet g_afterSlideLoadsId;\nFP.landscapeScroll = landscapeScroll;\n\nEventEmitter.on(events.bindEvents, bindEvents);\n\nfunction bindEvents(){\n    EventEmitter.on(events.onPerformMovement, onPerformMovement);\n}\n\nfunction onPerformMovement(){\n    clearTimeout(g_afterSlideLoadsId);\n    setState({slideMoving: false});\n}\n\n\n/**\n* Scrolls horizontal sliders.\n*/\nexport function landscapeScroll(slides, destiny, direction){\n    var sectionElem = utils.closest(slides, SECTION_SEL);\n    var section = getState().sections.filter(section => {\n        return section.item == sectionElem;\n    })[0];\n\n    var slide = section.slides.filter(function(slide){\n        return slide.item == destiny;\n    })[0];\n    var v = {\n        \"slides\": slides,\n        \"destiny\": destiny,\n        \"direction\": direction,\n        \"destinyPos\": {\"left\": destiny.offsetLeft},\n        \"slideIndex\": slide.index(),\n        \"section\": sectionElem,\n        \"sectionIndex\": section.index(),\n        \"anchorLink\": section.anchor,\n        \"slidesNav\": utils.$(SLIDES_NAV_SEL, sectionElem)[0],\n        \"slideAnchor\": slide.anchor,\n        \"prevSlide\": section.activeSlide.item,\n        \"prevSlideIndex\": section.activeSlide.index(),\n        \"items\": {\n            \"section\": section,\n            \"origin\": section.activeSlide,\n            \"destination\": slide\n        },\n\n        //caching the value of isResizing at the momment the function is called\n        //because it will be checked later inside a setTimeout and the value might change\n        \"localIsResizing\": state.isResizing\n    };\n    v.xMovement = getXmovement(v.prevSlideIndex, v.slideIndex);\n    v.direction = v.direction ? v.direction : v.xMovement;\n\n    //important!! Only do it when not resizing\n    if(!v.localIsResizing){\n        //preventing from scrolling to the next/prev section when using scrollHorizontally\n        setState({canScroll: false});\n    }\n\n    if(getOptions().onSlideLeave){\n\n        //if the site is not just resizing and readjusting the slides\n        if(!v.localIsResizing && v.xMovement!=='none'){\n            if(utils.isFunction( getOptions().onSlideLeave )){\n                if( fireCallback('onSlideLeave', v) === false){\n                    setState({slideMoving: false});\n                    return;\n                }\n            }\n        }\n    }\n\n    utils.addClass(destiny, ACTIVE);\n    utils.removeClass(utils.siblings(destiny), ACTIVE);\n    updateState();\n\n    if(!v.localIsResizing){\n        stopMedia(v.prevSlide);\n        lazyLoadPanels(slide);\n    }\n\n    toggleControlArrows(v);\n\n    //only changing the URL if the slides are in the current section (not for resize re-adjusting)\n    if(section.isActive && !v.localIsResizing){\n        setPageStatus(v.slideIndex, v.slideAnchor, v.anchorLink);\n    }\n\n    EventEmitter.emit(events.onSlideLeave, v);\n\n    performHorizontalMove(slides, v, true);\n}\n\n/**\n* Performs the horizontal movement. (CSS3 or jQuery)\n*\n* @param fireCallback {Boolean} - determines whether or not to fire the callback\n*/\nfunction performHorizontalMove(slides, v, fireCallback){\n    var destinyPos = v.destinyPos;\n\n    activeSlidesNavigation(v.slidesNav, v.slideIndex);\n    setState({\n        scrollX: Math.round(destinyPos.left)\n    });\n\n    if(getOptions().css3){\n        var translate3d = 'translate3d(-' + Math.round(destinyPos.left) + 'px, 0px, 0px)';\n\n        FP.test.translate3dH[v.sectionIndex] = translate3d;\n        utils.css(addAnimation(utils.$(SLIDES_CONTAINER_SEL, slides)), getTransforms(translate3d));\n\n        clearTimeout(g_afterSlideLoadsId);\n        g_afterSlideLoadsId = setTimeout(function(){\n            if(fireCallback){\n                afterSlideLoads(v);\n            }\n        }, getOptions().scrollingSpeed);\n    }else{\n        FP.test.left[v.sectionIndex] = Math.round(destinyPos.left);\n\n        scrollTo(slides, Math.round(destinyPos.left), getOptions().scrollingSpeed, function(){\n            if(fireCallback){\n                afterSlideLoads(v);\n            }\n        });\n    }\n}\n\n/**\n* Retuns `right` or `left` depending on the scrolling movement to reach its destination\n* from the current slide.\n*/\nfunction getXmovement(fromIndex, toIndex){\n    if( fromIndex == toIndex){\n        return 'none';\n    }\n    if(fromIndex > toIndex){\n        return 'left';\n    }\n    return 'right';\n}\n\nexport function onDestroy(){\n    clearTimeout(g_afterSlideLoadsId);\n}\n\nfunction afterSlideLoads(v){\n\n    //if the site is not just resizing and readjusting the slides\n    if(!v.localIsResizing){\n        if(utils.isFunction( getOptions().afterSlideLoad )){\n            fireCallback('afterSlideLoad', v);\n        }\n\n        //needs to be inside the condition to prevent problems with continuousVertical and scrollHorizontally\n        //and to prevent double scroll right after a windows resize\n        setState({canScroll: true});\n        \n        playMedia(v.destiny);\n\n        EventEmitter.emit(events.afterSlideLoads, v);\n    }\n\n    //letting them slide again\n    setState({slideMoving: false});\n}\n"
  },
  {
    "path": "src/js/slides/moveSlide.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions } from '../common/options.js';\nimport { getState, setState, state } from '../common/state.js';\nimport { FP } from '../common/constants.js';\nimport { SLIDES_WRAPPER_SEL, SLIDE_SEL } from '../common/selectors.js';\nimport { landscapeScroll } from './landscapeScroll.js';\nimport { getPanelByElement } from '../common/item.js';\n\n\nFP.moveSlideLeft = moveSlideLeft;\nFP.moveSlideRight = moveSlideRight;\n\n/**\n* Slides a slider to the given direction.\n* Optional `section` param.\n*/\nexport function moveSlide(direction, section){\n    var activeSectionItem = section == null ? getState().activeSection.item : section;\n    var activeSection = getPanelByElement(state.sections, activeSectionItem);\n    var slides = utils.$(SLIDES_WRAPPER_SEL, activeSectionItem)[0];\n\n    // more than one slide needed and nothing should be sliding\n    if (slides == null || state.slideMoving || activeSection.slides.length < 2) {\n        return;\n    }\n\n    var currentSlide = activeSection.activeSlide;\n    var destiny = direction === 'left' ? currentSlide.prev() : currentSlide.next();\n\n    //isn't there a next slide in the secuence?\n    if(!destiny){\n        //respect loopHorizontal setting\n        if (!getOptions().loopHorizontal) return;\n\n        destiny = direction === 'left' ? utils.getLast(activeSection.slides) : activeSection.slides[0];\n    }\n\n    setState({slideMoving: true && !FP.test.isTesting});\n    landscapeScroll(slides, destiny.item, direction);\n}\n\n/**\n* Slides left the slider of the active section.\n* Optional `section` param.\n*/\nexport function moveSlideLeft(section){\n    moveSlide('left', section);\n}\n\n/**\n* Slides right the slider of the active section.\n* Optional `section` param.\n*/\nexport function moveSlideRight(section){\n    moveSlide('right', section);\n}"
  },
  {
    "path": "src/js/slides/scrollSlider.js",
    "content": "import * as utils from '../common/utils.js';\nimport { SLIDES_WRAPPER_SEL } from \"../common/selectors.js\";\nimport { landscapeScroll } from './landscapeScroll.js';\n\n/**\n* Scrolls the slider to the given slide destination for the given section\n*/\nexport function scrollSlider(slideElem){\n    if(slideElem != null){\n        landscapeScroll(utils.closest(slideElem, SLIDES_WRAPPER_SEL), slideElem);\n    }\n}"
  },
  {
    "path": "src/js/slides/silentLandscapeScroll.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOriginals } from '../common/options.js';\nimport { setState } from '../common/state.js';\nimport { SLIDES_WRAPPER_SEL } from '../common/selectors.js';\nimport { setScrollingSpeed } from '../speed.js';\nimport { landscapeScroll } from './landscapeScroll.js';\n\n/**\n* Slides silently (with no animation) the active slider to the given slide.\n* @param noCallback {bool} true or defined -> no callbacks\n*/\nexport function silentLandscapeScroll(activeSlide, noCallbacks){\n    setScrollingSpeed(0, 'internal');\n\n    if(typeof noCallbacks !== 'undefined'){\n        //preventing firing callbacks afterSlideLoad etc.\n        setState({isResizing: true});\n    }\n\n    landscapeScroll(utils.closest(activeSlide, SLIDES_WRAPPER_SEL), activeSlide);\n\n    if(typeof noCallbacks !== 'undefined'){\n        setState({isResizing: false});\n    }\n\n    setScrollingSpeed(getOriginals().scrollingSpeed, 'internal');\n}"
  },
  {
    "path": "src/js/slides/styleSlides.js",
    "content": "import * as utils from '../common/utils.js';\nimport { getOptions } from '../common/options.js';\nimport { state } from '../common/state.js';\nimport { addTableClass } from '../common/addTableClass.js';\nimport {\n    SLIDES_WRAPPER_SEL,\n    SLIDES_CONTAINER_SEL,\n    ACTIVE, \n    SLIDES_WRAPPER,\n    SLIDES_CONTAINER,\n} from '../common/selectors.js';\nimport { addSlidesNavigation } from '../nav/slides.js';\nimport { createSlideArrows } from '../arrows.js';\nimport { silentLandscapeScroll } from './silentLandscapeScroll.js';\nimport { doc } from '../common/constants.js';\n\n/**\n* Styles the horizontal slides for a section.\n*/\nexport function styleSlides(section){\n    var numSlides = section.slides.length;\n    var slidesElems = section.allSlidesItems;\n    var slides = section.slides;\n    var sliderWidth = numSlides * 100;\n    var slideWidth = 100 / numSlides;\n\n    if(!utils.$(SLIDES_WRAPPER_SEL, section.item)[0]){\n        var slidesWrapper = doc.createElement('div');\n        slidesWrapper.className = SLIDES_WRAPPER; //fp-slides\n        utils.wrapAll(slidesElems, slidesWrapper);\n\n        var slidesContainer = doc.createElement('div');\n        slidesContainer.className = SLIDES_CONTAINER; //fp-slidesContainer\n        utils.wrapAll(slidesElems, slidesContainer);\n    }\n\n    utils.css(utils.$(SLIDES_CONTAINER_SEL, section.item), {'width': sliderWidth + '%'});\n\n    if(numSlides > 1){\n        if(getOptions().controlArrows){\n            createSlideArrows(section);\n        }\n\n        if(getOptions().slidesNavigation){\n            addSlidesNavigation(section);\n        }\n    }\n\n    slides.forEach(function(slide) {\n        utils.css(slide.item, {'width': slideWidth + '%'});\n\n        if(getOptions().verticalCentered){\n            addTableClass(slide);\n        }\n    });\n\n    var startingSlide = section.activeSlide || null;\n\n    //if the slide won't be an starting point, the default will be the first one (or last one for RTL)\n    //the active section isn't the first one? Is not the first slide of the first section? Then we load that section/slide by default.\n    if( startingSlide != null && state.activeSection && (state.activeSection.index() !== 0 || (state.activeSection.index() === 0 && startingSlide.index() !== 0))){\n        silentLandscapeScroll(startingSlide.item, 'internal');\n    }else{\n        // RTL: start from last slide, otherwise start from first\n        var defaultSlideIndex = getOptions().rtl && slidesElems.length > 0 ? slidesElems.length - 1 : 0;\n        utils.addClass(slidesElems[defaultSlideIndex], ACTIVE);\n    }\n}\n"
  },
  {
    "path": "src/js/speed.js",
    "content": "import { setVariableState } from './common/options.js';\nimport { FP } from './common/constants.js';\n\nFP.setScrollingSpeed = setScrollingSpeed;\n\n/**\n* Defines the scrolling speed\n*/\nexport function setScrollingSpeed(value, type){\n    setVariableState('scrollingSpeed', value, type);\n}"
  },
  {
    "path": "src/js/stateClasses.js",
    "content": "import * as utils from './common/utils.js';\nimport { getState } from './common/state.js';\nimport { $body } from './common/cache.js';\nimport { VIEWING_PREFIX } from './common/selectors.js';\n\n/**\n* Sets a class for the body of the page depending on the active section / slide\n*/\nexport function setBodyClass(){\n    var section = getState().activeSection.item;\n    var slide = getState().activeSection.activeSlide;\n\n    var sectionAnchor = getAnchor(section);\n    var text = String(sectionAnchor);\n\n    if(slide){\n        var slideAnchor = getAnchor(slide.item);\n        text = text + '-' + slideAnchor;\n    }\n\n    //changing slash for dash to make it a valid CSS style\n    text = text.replace('/', '-').replace('#','').replace(/\\s/g, '');\n\n    //removing previous anchor classes\n    var classRe = new RegExp('\\\\b\\\\s?' + VIEWING_PREFIX + '-[^\\\\s]+\\\\b', \"g\");\n    $body.className = $body.className.replace(classRe, '');\n\n    //adding the current anchor\n    utils.addClass($body, VIEWING_PREFIX + '-' + text);\n}\n\n/**\n* Gets the anchor for the given slide / section. Its index will be used if there's none.\n*/\nfunction getAnchor(element){\n    if(!element){\n        return null;\n    }\n    var anchor = utils.getAttr(element, 'data-anchor');\n    var elementIndex = utils.index(element);\n\n    //Slide without anchor link? We take the index instead.\n    if(anchor == null){\n        anchor = elementIndex;\n    }\n\n    return anchor;\n}"
  },
  {
    "path": "src/js/stateUpdates.js",
    "content": "import * as utils from './common/utils.js';\nimport { getOptions, getContainer, setVariableState } from './common/options.js';\nimport { getPanelByElement, Item } from './common/item.js';\nimport { ACTIVE, OVERFLOW } from './common/selectors.js';\nimport { getState, state } from './common/state.js';\nimport { silentScroll } from './common/silentScroll.js';\nimport { silentLandscapeScroll } from './slides/silentLandscapeScroll.js';\nimport { scrollOverflowHandler } from './scrolloverflow.js';\nimport { EventEmitter } from './common/eventEmitter.js';\nimport { events } from './common/events.js';\n\nlet g_prevActiveSectionIndex = null;\nlet g_prevActiveSlideIndex = null;\n\nEventEmitter.on(events.onDestroyAll, onDestroyAll);\n\nfunction onDestroyAll(){\n    g_prevActiveSectionIndex = null;\n    g_prevActiveSlideIndex = null;\n}\n\n/** \n * Updates the state of the app.\n */\nexport function updateState(){\n\n    state.activeSection = null;\n    state.sections.map(function(section){\n        let isActive = utils.hasClass(section.item, ACTIVE);\n        section.isActive = isActive;\n        section.hasScroll = scrollOverflowHandler.hasScroll(section.item);\n        if(isActive){\n            state.activeSection = section;\n        }\n\n        if(section.slides.length){\n            section.activeSlide = null;\n            section.slides.map(function(slide){\n                let isActiveSlide = utils.hasClass(slide.item, ACTIVE);\n                slide.hasScroll = scrollOverflowHandler.hasScroll(section.item);\n                slide.isActive = isActiveSlide;\n                if(isActiveSlide){\n                    section.activeSlide = slide;\n                }\n            });\n\n            if(!section.slides.find(slide => slide.isActive)){\n                // RTL: start from last slide, otherwise start from first\n                var defaultSlide = getOptions().rtl && section.slides.length > 0 \n                    ? section.slides[section.slides.length - 1] \n                    : section.slides[0];\n                    \n                section.activeSlide = defaultSlide;\n                if(section.activeSlide){\n                    section.activeSlide.isActive = true;\n                }\n            }\n        }\n    });\n\n    scrollToNewActivePanel();\n}\n\nexport function updateStructuralState(){\n    var allSectionItems = utils.$(getOptions().sectionSelector, getContainer());\n    var sectionsItems = utils.getVisible(allSectionItems);\n    var allSections = Array.from(allSectionItems).map( item => new SectionPanel(item));\n    var sections = allSections.filter( item => item.isVisible);\n    var slides = sections.reduce(function(acc, section){\n        return acc.concat(section.slides);\n    }, []);\n\n    // keeping track of the previously active section\n    g_prevActiveSectionIndex = getPrevActivePanelIndex(state.activeSection);\n    g_prevActiveSlideIndex = getPrevActivePanelIndex(state.activeSection ? state.activeSection.activeSlide : null);\n\n    state.numSections = sectionsItems.length;\n    state.numSlides = sections.reduce( function(acc, section){\n        return acc + section.slides.length;\n    }, 0);\n    state.sections = sections;\n\n    state.sectionsIncludingHidden = allSections;\n    state.slides = slides;\n    state.panels = state.sections.concat(state.slides);\n}\n\nfunction getPrevActivePanelIndex(activePanel){\n    if(!activePanel){\n        return null;\n    }\n    var prevActivePanelItem = activePanel ? activePanel.item : null;\n    var hiddenPanels = activePanel.isSection ? state.sectionsIncludingHidden : state.activeSection.slidesIncludingHidden;\n    if(prevActivePanelItem){\n        let panel = getPanelByElement(hiddenPanels, prevActivePanelItem);\n        return panel ? panel.index() : null;\n    }\n    return null;\n}\n\n/**\n * When changes in the DOM take place there's a change \n * the active section is now hidden or removed. \n * fullPage.js will scroll to the closest section nearby.\n */\nfunction scrollToNewActivePanel(){\n    var activeSection = state.activeSection;\n    var activeSectionHasSlides = state.activeSection ? state.activeSection.slides.length : false;\n    var activeSlide = state.activeSection ? state.activeSection.activeSlide : null;\n\n    // Hidding / removing the active section ?\n    if(!activeSection && state.sections.length && !getState().isBeyondFullpage && g_prevActiveSectionIndex !== null){\n        var newActiveSection = getNewActivePanel(g_prevActiveSectionIndex, state.sections);\n        if(newActiveSection){\n            state.activeSection = newActiveSection;\n            state.activeSection.isActive = true;\n            utils.addClass(state.activeSection.item, ACTIVE);\n        }\n        if(state.activeSection){\n            silentScroll(state.activeSection.item.offsetTop);\n        }\n    }\n    if(activeSectionHasSlides && !activeSlide && g_prevActiveSlideIndex !== null){\n        var newActiveSlide = getNewActivePanel(g_prevActiveSlideIndex, state.activeSection.slides);\n        if(newActiveSlide){\n            state.activeSection.activeSlide = newActiveSlide;\n            state.activeSection.activeSlide.isActive = true;\n            utils.addClass(state.activeSection.activeSlide.item, ACTIVE);\n        }\n        if(state.activeSection.activeSlide){\n            silentLandscapeScroll(state.activeSection.activeSlide.item, 'internal');\n        }\n    }\n}\n\nfunction getNewActivePanel(prevActivePanelIndex, siblings){\n    let newActiveSection;\n    let prevIndex = prevActivePanelIndex -1;\n    let nextIndex = prevActivePanelIndex;\n    do{\n        newActiveSection = siblings[prevIndex] || siblings[nextIndex];\n        if(newActiveSection){\n            break;\n        }\n        prevIndex = prevIndex - 1;\n        nextIndex = nextIndex + 1;\n    }while(prevIndex >= 0 || nextIndex < siblings.length);\n\n    return newActiveSection;\n}\n\n/**\n* Section object\n*/\nexport let SectionPanel = function(el){\n    [].push.call(arguments, getOptions().sectionSelector);\n    Item.apply(this, arguments);\n\n    this.allSlidesItems = utils.$(getOptions().slideSelector, el);\n    this.slidesIncludingHidden = Array.from(this.allSlidesItems).map( item => new SlidePanel(item, this));\n    this.slides = this.slidesIncludingHidden.filter(slidePanel => slidePanel.isVisible);\n    \n    // RTL: start from last slide, otherwise start from first\n    var defaultSlide = getOptions().rtl && this.slides.length > 0 \n        ? this.slides[this.slides.length - 1] \n        : (this.slides.length > 0 ? this.slides[0] : null);\n    \n    this.activeSlide = this.slides.length ? this.slides.filter(slide => slide.isActive)[0] || defaultSlide: null;\n\n    if(this.activeSlide){\n        this.activeSlide.isActive = true;\n    }\n};\nSectionPanel.prototype = Item.prototype;\nSectionPanel.prototype.constructor = SectionPanel;\n\n\n\n/**\n* Slide object\n*/\nlet SlidePanel = function(el, section){\n    this.parent = section;\n    Item.call(this, el, getOptions().slideSelector);\n};\n\nSlidePanel.prototype = Item.prototype;\nSlidePanel.prototype.constructor = SectionPanel;\n"
  },
  {
    "path": "src/js/touch.js",
    "content": "import * as utils from './common/utils.js';\nimport { getIsScrollAllowed } from './common/isScrollAllowed.js';\nimport { isTouchDevice, isTouch, win } from './common/constants.js';\nimport { $body } from './common/cache.js';\nimport { getOptions } from './common/options.js';\nimport { getState, setState, state } from './common/state.js';\nimport { \n    SECTION_SEL,\n    SLIDES_WRAPPER_SEL\n} from './common/selectors.js';\nimport { EventEmitter } from './common/eventEmitter.js';\nimport { scrolling } from './scroll/scrolling.js';\nimport { scrollOverflowHandler } from './scrolloverflow.js';\nimport { events } from './common/events.js';\n\nlet touchStartY = 0;\nlet touchStartX = 0;\nlet touchEndY = 0;\nlet touchEndX = 0;\nconst MSPointer = getMSPointer();\nconst pointers = {\n    touchmove: 'ontouchmove' in window ? 'touchmove' :  MSPointer ? MSPointer.move : null,\n    touchstart: 'ontouchstart' in window ? 'touchstart' :  MSPointer ? MSPointer.down : null\n};\n\n/**\n* Adds the possibility to auto scroll through sections on touch devices.\n*/\nexport function addTouchHandler(){\n    if(!pointers.touchmove){\n        return;\n    }\n    if(isTouchDevice || isTouch){\n        if(getOptions().autoScrolling){\n            $body.removeEventListener(pointers.touchmove, preventBouncing, {passive: false});\n            $body.addEventListener(pointers.touchmove, preventBouncing, {passive: false});\n        }\n\n        var touchWrapper = getOptions().touchWrapper;\n        touchWrapper.removeEventListener(pointers.touchstart, touchStartHandler);\n        touchWrapper.removeEventListener(pointers.touchmove, touchMoveHandler, {passive: false});\n\n        touchWrapper.addEventListener(pointers.touchstart, touchStartHandler);\n        touchWrapper.addEventListener(pointers.touchmove, touchMoveHandler, {passive: false});\n    }\n}\n\n\n/**\n* Removes the auto scrolling for touch devices.\n*/\nexport function removeTouchHandler(){\n    if(!pointers.touchmove){\n        return;\n    }\n    if(isTouchDevice || isTouch){\n        // normalScrollElements requires it off #2691\n        if(getOptions().autoScrolling){\n            $body.removeEventListener(pointers.touchmove, touchMoveHandler, {passive: false});\n            $body.removeEventListener(pointers.touchmove, preventBouncing, {passive: false});\n        }\n\n        var touchWrapper = getOptions().touchWrapper;\n        touchWrapper.removeEventListener(pointers.touchstart, touchStartHandler);\n        touchWrapper.removeEventListener(pointers.touchmove, touchMoveHandler, {passive: false});\n    }\n}\n\n\n/* Detecting touch events\n\n* As we are changing the top property of the page on scrolling, we can not use the traditional way to detect it.\n* This way, the touchstart and the touch moves shows an small difference between them which is the\n* used one to determine the direction.\n*/\nfunction touchMoveHandler(e){\n    var activeSection = utils.closest(e.target, SECTION_SEL) || getState().activeSection.item;\n    var hasActiveSectionOverflow = scrollOverflowHandler.isScrollable(getState().activeSection);\n    \n    if (isReallyTouch(e) ) {\n        setState({\n            isGrabbing: true,\n            isUsingWheel: false\n        });\n\n        if(getOptions().autoScrolling){\n            if( (hasActiveSectionOverflow && !state.canScroll) || getOptions().scrollBar){\n\n                //preventing the easing on iOS devices\n                utils.preventDefault(e);\n            }\n        }\n\n        var touchEvents = getEventsPage(e);\n\n        touchEndY = touchEvents.y;\n        touchEndX = touchEvents.x;\n\n        var isVerticalMovementEnough = Math.abs(touchStartY - touchEndY) > (win.innerHeight / 100 * getOptions().touchSensitivity);\n        var isHorizontalMovementEnough = Math.abs(touchStartX - touchEndX) > (utils.getWindowWidth() / 100 * getOptions().touchSensitivity);\n        var isHorizontalPredominantMove = utils.$(SLIDES_WRAPPER_SEL, activeSection).length && Math.abs(touchStartX - touchEndX) > (Math.abs(touchStartY - touchEndY));\n        var directionH = touchStartX > touchEndX ? 'right' : 'left';\n        var directionV = touchStartY > touchEndY ? 'down' : 'up';\n        var direction = isHorizontalPredominantMove ? directionH : directionV;\n\n        setState({touchDirection: direction});\n\n        //if movement in the X axys is greater than in the Y and the currect section has slides...\n        if (isHorizontalPredominantMove) {\n\n            //is the movement greater than the minimum resistance to scroll?\n            if (!state.slideMoving && isHorizontalMovementEnough) {\n                if (touchStartX > touchEndX) {\n                    if(getIsScrollAllowed().m.right){\n                        EventEmitter.emit(events.moveSlideRight, {section: activeSection});\n                    }\n                } else {\n                    if(getIsScrollAllowed().m.left){\n                        EventEmitter.emit(events.moveSlideLeft, {section: activeSection});\n                    }\n                }\n            }\n        }\n\n        //vertical scrolling (only when autoScrolling is enabled)\n        else if(getOptions().autoScrolling && state.canScroll){\n\n            //is the movement greater than the minimum resistance to scroll?\n            if (isVerticalMovementEnough) {\n                scrolling(directionV);\n            }\n        }\n    }\n}\n\n/**\n* As IE >= 10 fires both touch and mouse events when using a mouse in a touchscreen\n* this way we make sure that is really a touch event what IE is detecting.\n*/\nfunction isReallyTouch(e){\n    //if is not IE   ||  IE is detecting `touch` or `pen`\n    return typeof e.pointerType === 'undefined' || e.pointerType != 'mouse';\n}\n\n/**\n* Handler for the touch start event.\n*/\nfunction touchStartHandler(e){\n\n    //stopping the auto scroll to adjust to a section\n    if(getOptions().fitToSection){\n        setState({activeAnimation: false});\n    }\n\n    if(isReallyTouch(e)){\n        var touchEvents = getEventsPage(e);\n        touchStartY = touchEvents.y;\n        touchStartX = touchEvents.x;\n    }\n\n    utils.windowAddEvent('touchend', touchEndHandler);\n}\n\n/**\n* Handler for the touch end event.\n*/\nfunction touchEndHandler(){\n    utils.windowRemoveEvent('touchend', touchEndHandler);\n    setState({isGrabbing: false});\n}\n\n/**\n* Gets the pageX and pageY properties depending on the browser.\n* https://github.com/alvarotrigo/fullPage.js/issues/194#issuecomment-34069854\n*/\nfunction getEventsPage(e){\n    var events = {};\n\n    events.y = (typeof e.pageY !== 'undefined' && (e.pageY || e.pageX) ? e.pageY : e.touches[0].pageY);\n    events.x = (typeof e.pageX !== 'undefined' && (e.pageY || e.pageX) ? e.pageX : e.touches[0].pageX);\n\n    //in touch devices with scrollBar:true, e.pageY is detected, but we have to deal with touch events. #1008\n    if(isTouch && isReallyTouch(e) && getOptions().scrollBar && typeof e.touches !== 'undefined'){\n        events.y = e.touches[0].pageY;\n        events.x = e.touches[0].pageX;\n    }\n\n    return events;\n}\n\n/*\n* Returns and object with Microsoft pointers (for IE<11 and for IE >= 11)\n* http://msdn.microsoft.com/en-us/library/ie/dn304886(v=vs.85).aspx\n*/\nfunction getMSPointer(){\n    var pointer;\n\n    //IE >= 11 & rest of browsers\n    if(win.PointerEvent){\n        pointer = { down: 'pointerdown', move: 'pointermove'};\n    }\n\n    return pointer;\n}\n\n/*\n* Preventing bouncing in iOS #2285\n*/\nfunction preventBouncing(e){\n    if(getOptions().autoScrolling && isReallyTouch(e) && getIsScrollAllowed().m.up){\n        //preventing the easing on iOS devices\n        if(!state.canScroll){\n            utils.preventDefault(e);\n        }\n    }\n}"
  },
  {
    "path": "src/jsconfig.json",
    "content": "{\n    \"compilerOptions\": { \n        \"checkJs\": true,\n    },\n    \"updateImportsOnFileMove\": \"prompt\",\n    \"include\": [\"js/**/*\"],\n}"
  },
  {
    "path": "tests/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"https://code.jquery.com/qunit/qunit-2.17.1.css\">\n    <meta charset=\"utf-8\">\n\n    <title>fullpage.js - Tests</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../src/fullpage.css?v=22\" />\n\n    <style>\n    .show #qunit-fixture{\n        display: block;\n    }\n    .show #qunit{\n        display: none\n    }\n\n    .fullpage-layout{\n        display: none;\n    }\n    .fullpage-layout.active{\n        display: block;\n    }\n    .show #fullpage{\n        display: block;\n    }\n    #menu{\n        position:fixed;\n        top:0;\n        left:0;\n        height: 40px;\n        z-index: 70;\n        width: 100%;\n        padding: 0;\n        margin:0;\n    }\n    #menu-two{\n        position:fixed;\n        top:0;\n        left:500px;\n        height: 40px;\n        z-index: 70;\n        width: 100%;\n        padding: 0;\n        margin:0;\n    }\n    .normalscroll{\n        overflow: scroll;\n        height: 300px;\n    }\n    .normalScroll h1{\n        font-size: 50px;\n    }\n    .content{\n        height: 1400px;\n    }\n    #qunit-fixture{\n        height: 100%;\n        width: 1000px;\n    }\n    .box{\n        display: block;\n        height: 1000px;\n    }\n\n    .show #qunit-fixture,\n    .show-fixture{\n        position: relative !important;\n        top: 0 !important;\n        left: 0 !important;\n    }\n    </style>\n</head>\n<body>\n<div id=\"qunit\"></div>\n<div id=\"qunit-fixture\">\n\n    <ul id=\"menu\" class=\"menu\">\n        <li data-menuanchor=\"page1\"><a href=\"#page1\">One</a></li>\n        <li data-menuanchor=\"page2\"><a href=\"#page2\">Two</a></li>\n        <li data-menuanchor=\"page3\"><a href=\"#page3\">Three</a></li>\n        <li data-menuanchor=\"page4\"><a href=\"#page4\">Four</a></li>\n    </ul>\n\n    <ul id=\"menu-two\" class=\"menu\">\n        <li data-menuanchor=\"page1\"><a href=\"#page1\">One</a></li>\n        <li data-menuanchor=\"page2\"><a href=\"#page2\">Two</a></li>\n        <li data-menuanchor=\"page3\"><a href=\"#page3\">Three</a></li>\n        <li data-menuanchor=\"page4\"><a href=\"#page4\">Four</a></li>\n    </ul>\n\n    <div id=\"fullpage\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">Some section</div>\n        <div class=\"section\" id=\"section2\" style=\"background-color: blue;\">\n            <div class=\"slide\"> Slide 1 </div>\n            <div class=\"slide\"> Slide 2 </div>\n            <div class=\"slide\"> Slide 3 </div>\n            <div class=\"slide\"> Slide 4 </div>\n        </div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n\n    <div id=\"fullpage-slides-with-anchor\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">Some section</div>\n        <div class=\"section\" id=\"section2\" style=\"background-color: blue;\">\n            <div class=\"slide\" data-anchor=\"slide1\"> Slide 1 </div>\n            <div class=\"slide\" data-anchor=\"slide2\"> Slide 2 </div>\n            <div class=\"slide\" data-anchor=\"slide3\"> Slide 3 </div>\n            <div class=\"slide\" data-anchor=\"slide4\"> Slide 4 </div>\n        </div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n\n    <div id=\"fullpage-sections-and-slides-with-data-anchor\" class=\"fullpage-layout\">\n        <div class=\"section\" data-anchor=\"page1\" id=\"section1\">Some section</div>\n        <div class=\"section\" data-anchor=\"page2\" id=\"section2\" style=\"background-color: blue;\">\n            <div class=\"slide\" data-anchor=\"slide1\"> Slide 1 </div>\n            <div class=\"slide\" data-anchor=\"slide2\"> Slide 2 </div>\n            <div class=\"slide\" data-anchor=\"slide3\"> Slide 3 </div>\n            <div class=\"slide\" data-anchor=\"slide4\"> Slide 4 </div>\n        </div>\n        <div class=\"section\" data-anchor=\"page3\" id=\"section3\">Some section</div>\n        <div class=\"section\" data-anchor=\"page4\" id=\"section4\">Some section</div>\n    </div>\n\n    <div id=\"fullpage-moveSlideRight\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section2\">\n            <div class=\"slide\" id=\"slide-1-1\" data-anchor=\"slide1\"> Slide 1 </div>\n            <div class=\"slide\" id=\"slide-1-2\" data-anchor=\"slide2\"> Slide 2 </div>\n            <div class=\"slide\" id=\"slide-1-3\" data-anchor=\"slide3\"> Slide 3 </div>\n            <div class=\"slide\" id=\"slide-1-4\" data-anchor=\"slide4\"> Slide 4 </div>\n        </div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n\n\n    <div id=\"fullpage-moveSlideLeft\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section2\">\n            <div class=\"slide\" id=\"slide-1-1\"> Slide 1 </div>\n            <div class=\"slide\" id=\"slide-1-2\"> Slide 2 </div>\n            <div class=\"slide\" id=\"slide-1-3\"> Slide 3 </div>\n            <div class=\"slide active\" id=\"slide-1-4\"> Slide 4 </div>\n        </div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n\n\n    <div id=\"fullpage-single-slide\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">\n            <div class=\"slide\" id=\"slide-1-1\"> Slide 1 </div>\n        </div>\n        <div class=\"section\" id=\"section2\">Some section</div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n    </div>\n\n    <div id=\"fullpage-single-slide-in-second-section\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">Some section</div>\n        <div class=\"section\" id=\"section2\">\n             <div class=\"slide\" id=\"slide-2-1\"> Slide 1 </div>\n        </div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n    </div>\n\n\n    <!-- Active slide in 1st section active -->\n    <div id=\"fullpage-second-slide-active\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section2\">\n            <div class=\"slide\" id=\"slide-1-1\"> Slide 1 </div>\n            <div class=\"slide active\" id=\"slide-1-2\"> Slide 1 </div>\n        </div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n\n    <div id=\"fullpage-middle-slide-active\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">\n            <div class=\"slide\" id=\"slide-1-1\"> Slide 1 </div>\n            <div class=\"slide active\" id=\"slide-1-2\"> Slide 1 </div>\n            <div class=\"slide\" id=\"slide-1-3\"> Slide 3 </div>\n        </div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n\n    <div id=\"fullpage-first-slide-active\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section2\">\n            <div class=\"slide active\" id=\"slide-1-1\"> Slide 1 </div>\n            <div class=\"slide\" id=\"slide-1-2\"> Slide 1 </div>\n        </div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n    <!-- End Active slide in second section active -->\n\n\n    <!-- Active slide in second active section -->\n    <div id=\"fullpage-first-slide-active-in-2nd-section\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">Some section</div>\n        <div class=\"section\" id=\"section2\">\n            <div class=\"slide active\" id=\"slide-1-1\"> Slide 1 </div>\n            <div class=\"slide\" id=\"slide-1-2\"> Slide 1 </div>\n        </div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n\n    <div id=\"fullpage-middle-slide-active-in-2nd-section\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">Some section</div>\n        <div class=\"section\" id=\"section2\">\n            <div class=\"slide\" id=\"slide-1-1\"> Slide 1 </div>\n            <div class=\"slide active\" id=\"slide-1-2\"> Slide 2 </div>\n            <div class=\"slide\" id=\"slide-1-3\"> Slide 3 </div>\n        </div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n    <!-- End Active slide in second section active -->\n\n\n    <!-- Second section active -->\n    <div id=\"fullpage-2nd-active-section\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">Some section</div>\n        <div class=\"section active\" id=\"section2\">Some section</div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n\n    <div id=\"fullpage-first-slide-active-in-2nd-active-section\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">Some section</div>\n        <div class=\"section active\" id=\"section2\">\n            <div class=\"slide active\" id=\"slide-1-1\"> Slide 1 </div>\n            <div class=\"slide\" id=\"slide-1-2\"> Slide 2 </div>\n            <div class=\"slide\" id=\"slide-1-3\"> Slide 3 </div>\n        </div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n\n    <div id=\"fullpage-middle-slide-active-in-2nd-active-section\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">Some section</div>\n        <div class=\"section active\" id=\"section2\">\n            <div class=\"slide\" id=\"slide-1-1\"> Slide 1 </div>\n            <div class=\"slide active\" id=\"slide-1-2\"> Slide 2 </div>\n            <div class=\"slide\" id=\"slide-1-3\"> Slide 3 </div>\n        </div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n\n    <div id=\"fullpage-sigle-slide-active-in-2nd-active-section\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">Some section</div>\n        <div class=\"section active\" id=\"section2\">\n             <div class=\"slide\" id=\"slide-2-1\"> Slide 1 </div>\n        </div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n    </div>\n    <!-- End Second section active -->\n\n\n    <!-- 4th section active -->\n    <div id=\"fullpage-last-section-active\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">Some section</div>\n        <div class=\"section\" id=\"section2\">\n            <div class=\"slide\" id=\"slide-1-1\"> Slide 1 </div>\n            <div class=\"slide\" id=\"slide-1-2\"> Slide 2 </div>\n            <div class=\"slide\" id=\"slide-1-3\"> Slide 3 </div>\n        </div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section active\" id=\"section4\">Some section</div>\n    </div>\n    <!-- End 4th section active -->\n\n\n    <div id=\"fullpage-all-sections-with-slides\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">\n            <div class=\"slide\" id=\"slide-1-1\"> Slide 1 </div>\n            <div class=\"slide\" id=\"slide-1-2\"> Slide 1 </div>\n        </div>\n        <div class=\"section\" id=\"section2\">\n            <div class=\"slide\" id=\"slide-2-1\"> Slide 1 </div>\n            <div class=\"slide\" id=\"slide-2-2\"> Slide 1 </div>\n        </div>\n        <div class=\"section\" id=\"section3\">\n            <div class=\"slide\" id=\"slide-3-1\"> Slide 1 </div>\n            <div class=\"slide\" id=\"slide-3-2\"> Slide 1 </div>\n        </div>\n    </div>\n\n    <div id=\"fullpage-no-slides\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">Some section</div>\n        <div class=\"section\" id=\"section2\">Some section</div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n\n\n    <div id=\"fullpage-with-name-element\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">Some section</div>\n        <div class=\"section\" id=\"section2\"><a name=\"anchor-as-name\" />Some section</div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n\n    <div id=\"fullpage-with-id-element\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">Some section</div>\n        <div class=\"section\" id=\"section2\"><a id=\"anchor-as-id\" href=\"\">Some section</a></div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n\n    <div id=\"fullpage-nav-tooltips\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\" data-tooltip=\"demo1\">Some section</div>\n        <div class=\"section\" id=\"section2\" data-tooltip=\"demo2\">Some section</div>\n        <div class=\"section\" id=\"section3\" data-tooltip=\"demo3\">Some section</div>\n        <div class=\"section\" id=\"section4\" data-tooltip=\"demo4\">Some section</div>\n    </div>\n\n    <div id=\"fullpage-normalscrollelements\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">\n            <div class=\"title\">Section 1</div>\n            <div class=\"normalscroll\">\n                <h1>Test</h1><h1>Test</h1><h1>Test</h1><h1>Test</h1>\n                <h1>Test</h1><h1>Test</h1><h1>Test</h1><h1>Test</h1>\n                <h1>Test</h1><h1>Test</h1><h1>Test</h1><h1>Test</h1>\n                <h1>Test</h1><h1>Test</h1><h1>Test</h1><h1>Test</h1>\n            </div>\n        </div>\n        <div class=\"section\" id=\"section2\">Some section</div>\n        <div class=\"section\" id=\"section3\">Some section</div>\n        <div class=\"section\" id=\"section4\">Some section</div>\n    </div>\n\n    <div id=\"fullpage-scrolloverflow\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">\n            <div class=\"box\">a</div>\n            <div class=\"box\">b</div>\n        </div>\n        <div class=\"section\" id=\"section2\">Some section</div>\n        <div class=\"section\" id=\"section3\">\n            <div class=\"box\">a</div>\n            <div class=\"box\">b</div>\n        </div>\n    </div>\n\n\n    <div id=\"fullpage-auto-height\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">Some section</div>\n        <div class=\"section fp-auto-height\" id=\"section2\">\n            <div class=\"slide\"><div class=\"content\">Slide 1</div></div>\n            <div class=\"slide\"><div class=\"content\">Slide 2</div></div>\n            <div class=\"slide\"><div class=\"content\">Slide 3</div></div>\n            <div class=\"slide\"><div class=\"content\">Slide 4</div></div>\n        </div>\n        <div class=\"section fp-auto-height\" id=\"section3\"><div class=\"content\">Some section</div></div>\n        <div class=\"section fp-auto-height\" id=\"section4\"><div class=\"content\">Some section</div></div>\n    </div>\n\n    <div id=\"fullpage-custom-selector\" class=\"fullpage-layout\">\n        <div class=\"custom-section-selector\" id=\"section1\">Some section</div>\n        <div class=\"custom-section-selector fp-auto-height\" id=\"section2\">\n            <div class=\"slide\">Slide 1</div>\n            <div class=\"slide\">Slide 2</div>\n            <div class=\"slide\">Slide 3</div>\n            <div class=\"slide\">Slide 4</div>\n        </div>\n        <div class=\"custom-section-selector fp-auto-height\" id=\"section3\"><div class=\"content\">Some section</div></div>\n        <div class=\"custom-section-selector fp-auto-height\" id=\"section4\"><div class=\"content\">Some section</div></div>\n    </div>\n\n    <div id=\"fullpage-custom-slide-selector\" class=\"fullpage-layout\">\n        <div class=\"section\" id=\"section1\">Some section</div>\n        <div class=\"section fp-auto-height\" id=\"section2\">\n            <div class=\"custom-slide-selector\">Slide 1</div>\n            <div class=\"custom-slide-selector\">Slide 2</div>\n            <div class=\"custom-slide-selector\">Slide 3</div>\n            <div class=\"custom-slide-selector\">Slide 4</div>\n        </div>\n        <div class=\"section fp-auto-height\" id=\"section3\"><div class=\"content\">Some section</div></div>\n        <div class=\"section fp-auto-height\" id=\"section4\"><div class=\"content\">Some section</div></div>\n    </div>\n\n    <div id=\"fullpage-multiple-selectors\" class=\"fullpage-layout\">\n        <div class=\"selector1\" id=\"section1\" data-anchor=\"page1\">Some section</div>\n        <div class=\"section\" id=\"section2\" data-anchor=\"page2\">\n            <div class=\"custom-slide-selector\">Slide 1</div>\n            <div class=\"custom-slide-selector\">Slide 2</div>\n            <div class=\"custom-slide-selector\">Slide 3</div>\n        </div>\n        <div class=\"selector1\" id=\"section3\" data-anchor=\"page3\"><div class=\"content\">Some section</div></div>\n        <div class=\"section\" id=\"section4\" data-anchor=\"page4\"><div class=\"content\">Some section</div></div>\n    </div>\n</div>\n\n<script\n  src=\"https://code.jquery.com/jquery-3.3.1.min.js\"\n  integrity=\"sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=\"\n  crossorigin=\"anonymous\"></script>\n\n<script type=\"text/javascript\" src=\"https://code.jquery.com/qunit/qunit-2.17.1.js\"></script>\n<script type=\"text/javascript\" src=\"../build/fullpage.js\"></script>\n<script type=\"text/javascript\">\n\n</script>\n<script type=\"text/javascript\" src=\"utils.js\"></script>\n\n<!-- PASSED -->\n<!-- <script type=\"text/javascript\" src=\"./unit/arrows.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/bigSectionsDestination.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/callbacksV3.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/continuousVertical.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/destroy.js\"></script> -->\n\n<!-- \n    TODO\n    <script type=\"text/javascript\" src=\"./unit/displayWarnings.js\"></script> -->\n\n<!-- <script type=\"text/javascript\" src=\"./unit/easingcss3.js\"></script> -->\n\n<!-- \n    TODO\n    <script type=\"text/javascript\" src=\"./unit/fitToSection.js\"></script> -->\n\n<!-- <script type=\"text/javascript\" src=\"./unit/fixedElements.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/keyboardScrolling.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/lazyload.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/lockAnchors.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/loopBottom.js\"></script>\n<script type=\"text/javascript\" src=\"./unit/loopTop.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/menu.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/moveSectionDown.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/moveSectionUp.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/moveSlideLeft.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/moveSlideRight.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/moveTo.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/nav.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/normalScrollElements.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/paddings.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/recordHistory.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/responsiveHeight.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/responsiveWidth.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/scrollBar.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/scrollingSpeed.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/sectionsColor.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/selectors.js\"></script> -->\n<script type=\"text/javascript\" src=\"./unit/setAllowScrolling.js\"></script>\n<!-- <script type=\"text/javascript\" src=\"./unit/setAutoScrolling.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/silentMoveTo.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/slidesNavigation.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/verticalCentered.js\"></script> -->\n\n<!-- TO TEST -->\n<!--\n\n    NONE\n    \n-->\n\n\n\n<!-- \n    Not working on test file, because snap styles get applied to <body>\n    <script type=\"text/javascript\" src=\"./unit/fitToSection.js\"></script> -->\n\n<!-- \n<script type=\"text/javascript\" src=\"./unit/slidesNavigation.js\"></script>\n<script type=\"text/javascript\" src=\"./unit/easingcss3.js\"></script>\n<script type=\"text/javascript\" src=\"./unit/continuousVertical.js\"></script>\n<script type=\"text/javascript\" src=\"./unit/scrollBar.js\"></script>\n<script type=\"text/javascript\" src=\"./unit/normalScrollElements.js\"></script> -->\n<!-- <script type=\"text/javascript\" src=\"./unit/verticalCentered.js\"></script> -->\n\n\n\n</body>\n</html>\n"
  },
  {
    "path": "tests/unit/arrows.js",
    "content": "\nQUnit.test('Testing controlArrows:true', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew('#fullpage', {controlArrows:true, loopHorizontal: true});\n\n    assert.equal($(SLIDES_ARROW_SEL).length, 2, 'We expect 2 control arrows to exist');\n    assert.equal($(SLIDES_PREV_SEL).length, 1, 'We expect 1 prev control arrow');\n    assert.equal($(SLIDES_NEXT_SEL).length, 1, 'We expect 1 next control arrow');\n});\n\nQUnit.test('Testing controlArrows:false', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {controlArrows:false, loopHorizontal: true});\n\n    assert.equal($(SLIDES_ARROW_SEL).length, 0, 'We expect no control arrows to exist');\n});\n\nQUnit.test('Testing controlArrows:true & loopHorizontal:false in 1st slide', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {controlArrows:true, loopHorizontal: false});\n\n    assert.equal($(SLIDES_ARROW_SEL + ':visible').length, 1, 'We expect 2 control arrows to exist');\n    assert.equal($(SLIDES_ARROW_SEL + SLIDES_NEXT_SEL + ':visible').length, 1, 'We expect one next control arrow to exist');\n    assert.equal($(SLIDES_ARROW_SEL + SLIDES_PREV_SEL + ':visible').length, 0, 'We expect 0 prev control arrow to exist');\n});\n\nQUnit.test('Testing controlArrows:true & loopHorizontal:false in middle slide', function(assert) {\n    var id = '#fullpage-middle-slide-active';\n    var FP = initFullpageNew(id, {controlArrows:true, loopHorizontal: false});\n\n    assert.equal($(SLIDES_ARROW_SEL + ':visible').length, 2, 'We expect 2 control arrows to exist');\n});\n\nQUnit.test('Testing controlArrows:true & loopHorizontal:false in last slide', function(assert) {\n    var id = '#fullpage-second-slide-active';\n    var FP = initFullpageNew(id, {controlArrows:true, loopHorizontal: false});\n\n    assert.equal($(SLIDES_ARROW_SEL + ':visible').length, 1, 'We expect 1 control arrow to exist');\n    assert.equal($(SLIDES_ARROW_SEL + SLIDES_PREV_SEL + ':visible').length, 1, 'We expect 1 prev control arrow to exist');\n    assert.equal($(SLIDES_ARROW_SEL + SLIDES_NEXT_SEL + ':visible').length, 0, 'We expect 0 next control arrow to exist');\n\n});\n\nQUnit.test('Testing controlArrowColor', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {controlArrowColor:'blue', loopHorizontal: true});\n\n    assert.equal($(SLIDES_ARROW_SEL + ':visible').first()[0].style.borderColor, 'transparent blue transparent transparent', 'We expect the prev arrow to be blue');\n    assert.equal($(SLIDES_ARROW_SEL + ':visible').last()[0].style.borderColor, 'transparent transparent transparent blue', 'We expect the next arrow to be blue');\n});\n\n"
  },
  {
    "path": "tests/unit/bigSectionsDestination.js",
    "content": "QUnit.test('Testing bigSectionsDestination:bottom', function(assert) {\n    var id = '#fullpage-auto-height';\n    var FP = initFullpageNew(id, {autoScrolling:true, bigSectionsDestination: 'bottom'});\n    var windowHeight = $(window).height();\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], 'We expect sections transformation to be [0, 0, 0]');\n    FP.moveSectionDown();\n\n    var sectionBottom =  $(SECTION_SEL).eq(1)[0].offsetTop - windowHeight +  $(SECTION_SEL).eq(1)[0].offsetHeight;\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(sectionBottom)}`, '0'], `We expect sections transformation to be [0, ${-(sectionBottom)}, 0]`);\n});\n\nQUnit.test('Testing bigSectionsDestination:top', function(assert) {\n    var id = '#fullpage-auto-height';\n    var FP = initFullpageNew(id, {autoScrolling:true, bigSectionsDestination: 'top'});\n    var windowHeight = $(window).height();\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], 'We expect sections transformation to be [0, 0, 0]');\n    FP.moveSectionDown();\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n});"
  },
  {
    "path": "tests/unit/callbacks.js",
    "content": "\n// onSlideLeave\n// ---------------------------------------\nQUnit.test('Testing onSlideLeave callback fullpage-moveSlideRight', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n    var done = assert.async(3);\n    var i;\n    var cont = 0;\n\n    for(i = 0; i < 3; i++, cont++){\n        setTimeout(afterMove.bind(null, i), cont * 100);\n    }\n\n    function afterMove(i){\n        FP.moveSlideRight();\n        assert.equal(onSlideLeave, 'null, 1, '+ i +', right, ' + (i+1) + '', 'We expect the right values for the callback');\n        done();\n    }\n});\n\nQUnit.test('Testing onSlideLeave callback fullpage-moveSlideRight with anchors', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({scrollingSpeed: 50}, allBasicOptions, sectionsAndSlidesCallbacks, {v2compatible:true}));\n    var done = assert.async(3);\n    var i;\n    var cont = 0;\n\n    for(i = 0; i < 3; i++, cont++){\n        setTimeout(afterMove.bind(null, i), cont * 100);\n    }\n\n    function afterMove(i){\n        FP.moveSlideRight();\n        assert.equal(onSlideLeave, 'page1, 1, '+ i +', right, ' + (i+1) + '', 'We expect the right values for the callback');\n        done();\n    }\n});\n\nQUnit.test('Testing onSlideLeave callback fullpage-moveSlideLeft', function(assert) {\n    var id = '#fullpage-moveSlideLeft';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n    var done = assert.async(3);\n    var i;\n    var cont = 0;\n\n    for(i = 2; i >= 0; i--, cont++){\n        setTimeout(afterMove.bind(null, i), cont * 100);\n    }\n\n    function afterMove(i){\n        FP.moveSlideLeft();\n        assert.equal(onSlideLeave, 'null, 1, '+ (i+1) +', left, ' + i + '', 'We expect the right values for the callback');\n        done();\n    }\n});\n\nQUnit.test('Testing onSlideLeave from last slide to first with loopHorizontal', function(assert) {\n    var id = '#fullpage-moveSlideLeft';\n    var FP = initFullpageNew(id, Object.assign({scrollingSpeed: 50}, sectionsAndSlidesCallbacks, {loopHorizontal: true, v2compatible:true}));\n\n    FP.moveSlideRight();\n    assert.equal(onSlideLeave, 'null, 1, 3, right, 0', 'We expect the right values for the callback');\n});\n\nQUnit.test('Testing onSlideLeave from 1st slide to last', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {loopHorizontal: true, v2compatible:true}));\n\n    FP.moveSlideLeft();\n    assert.equal(onSlideLeave, 'null, 1, 0, left, 3', 'We expect the right values for the callback');\n});\n\n\n// afterSlideLoad\n// ---------------------------------------\nQUnit.test('Testing afterSlideLoad callback', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    var done = assert.async(1);\n\n    FP.moveSlideRight();\n\n    assert.equal(slideLoaded[0], false, 'We expect slide 1.1 to not be loaded');\n    assert.equal(slideLoaded[1], false, 'We expect slide 1.2 to not be loaded');\n    assert.equal(areOthersLoaded(slideLoaded), 0, 'We expect 0 slides to be loaded');\n\n    setTimeout(function(){\n        assert.equal(slideLoaded[1], true, 'We expect slide 1.2 to be loaded');\n        assert.equal(areOthersLoaded(slideLoaded), 1, 'We expect only 1 slide to be loaded');\n        assert.equal(afterSlideLoad, 'null, 1, slide2, 1', 'We expect the right values for the callback');\n\n        done();\n    }, 100);\n});\n\nQUnit.test('Testing afterSlideLoad callback with anchors', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({scrollingSpeed:50}, allBasicOptions, sectionsAndSlidesCallbacks, {v2compatible:true}));\n\n    var done = assert.async(1);\n\n    FP.moveSlideRight();\n\n    setTimeout(function(){\n        assert.equal(afterSlideLoad, 'page1, 1, slide2, 1', 'We expect the right values for the callback');\n        done();\n    }, 100);\n});\n\n\n//this test should be reviewed.\n//at the moment the afterSlideLoad callback doesn't get fired on page load, no matter what\n//section is active by default. But... Probably it should...\nQUnit.test('Testing afterSlideLoad callback with active 2nd section and 1st slide active', function(assert) {\n    var id = '#fullpage-first-slide-active-in-2nd-active-section';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    assert.equal(slideLoaded[1], false, 'We expect section 2 to not be loaded');\n    assert.equal(areOthersLoaded(slideLoaded), 0, 'We expect 0 slides to be loaded');\n    assert.equal(afterSlideLoad, '', 'We expect no values for the callback');\n});\n\n\n//this test should be reviewed.\n//at the moment the afterSlideLoad callback doesn't get fired on page load, no matter what\n//section is active by default. But... Probably it should...\nQUnit.test('Testing afterSlideLoad callback with active 2nd section and middle slide active', function(assert) {\n    var id = '#fullpage-middle-slide-active-in-2nd-active-section';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    assert.equal(slideLoaded[1], false, 'We expect middle slide to not be loaded');\n    assert.equal(areOthersLoaded(slideLoaded), 0, 'We expect 0 slides to be loaded');\n    assert.equal(afterSlideLoad, '', 'We expect no values for the afterSlideLoad callback');\n});\n\n\n//this test should be reviewed.\n//at the moment the afterSlideLoad callback doesn't get fired on page load, no matter what\n//section is active by default. But... Probably it should...\nQUnit.test('Testing afterSlideLoad callback with active 2nd section and single slide active', function(assert) {\n    var id = '#fullpage-single-slide-in-second-section';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    assert.equal(slideLoaded[0], false, 'We expect the single slide to not be loaded');\n    assert.equal(areOthersLoaded(slideLoaded), 0, 'We expect 0 sections to be loaded');\n    assert.equal(afterSlideLoad, '', 'We expect no values for the callback');\n});\n\n\n// afterRender\n// ---------------------------------------\nQUnit.test('Testing afterRender callback with section', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    assert.equal(sectionLoaded[0], true, 'We expect section 1 be loaded');\n    assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect only 1 section to be loaded');\n});\n\nQUnit.test('Testing afterRender callback with slides', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    assert.deepEqual(afterRender, [0, 0], 'We expect Section 0.0 be loaded');\n});\n\nQUnit.test('Testing afterRender callback on fullpage-2nd-active-section', function(assert) {\n    var id = '#fullpage-2nd-active-section';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n    assert.deepEqual(afterRender, [1, -1], 'We expect Section 1 be loaded');\n});\n\nQUnit.test('Testing afterRender callback on fullpage-middle-slide-active-in-2nd-active-section', function(assert) {\n    var id = '#fullpage-2nd-active-section';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n    assert.deepEqual(afterRender, [1, -1], 'We expect Section 1.1 be loaded');\n});\n\nQUnit.test('Testing afterRender callback on fullpage-first-slide-active-in-2nd-active-section', function(assert) {\n    var id = '#fullpage-first-slide-active-in-2nd-active-section';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n    assert.deepEqual(afterRender, [1, 0], 'We expect Section 1.0 be loaded');\n});\n\nQUnit.test('Testing afterRender callback on fullpage-sigle-slide-active-in-2nd-active-section', function(assert) {\n    var id = '#fullpage-sigle-slide-active-in-2nd-active-section';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n    assert.deepEqual(afterRender, [1, 0], 'We expect Section 1.0 be loaded');\n});\n\n\n\n// afterLoad\n// ---------------------------------------\nQUnit.test('Testing afterLoad callback on scroll with section', function(assert) {\n    var id = '#fullpage-no-slides';\n    var done = assert.async(2);\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    FP.moveSectionDown();\n\n    setTimeout(function(){\n        assert.equal(sectionLoaded[1], true, 'We expect section 2 be loaded');\n        assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect only 2 section to be loaded');\n        assert.equal(afterLoad, 'null, 2', 'We expect the right values for the callback');\n        done();\n        FP.moveSectionDown();\n    }, 100);\n\n    setTimeout(function(){\n        assert.equal(sectionLoaded[2], true, 'We expect section 3 be loaded');\n        assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect only section 3 to be loaded');\n        assert.equal(afterLoad, 'null, 3', 'We expect the right values for the callback');\n        done();\n    }, 100*2);\n});\n\nQUnit.test('Testing afterLoad callback on scroll with section and anchors', function(assert) {\n    var id = '#fullpage-sections-and-slides-with-data-anchor';\n    var done = assert.async(1);\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    FP.moveSectionDown();\n\n    setTimeout(function(){\n        assert.equal(afterLoad, 'page2, 2', 'We expect the right values for the callback');\n        done();\n    }, 100);\n});\n\n\nQUnit.test('Testing afterLoad when autoScrolling:false on scroll with section', function(assert) {\n    var id = '#fullpage-no-slides';\n    var done = assert.async(2);\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, autoScrolling: false, v2compatible: true}));\n\n    simulateScroll(window.innerHeight);\n\n    setTimeout(function(){\n        assert.equal(sectionLoaded[1], true, 'We expect section 2 be loaded');\n        assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect only 2 section to be loaded');\n        assert.equal(afterLoad, 'null, 2', 'We expect the right values for the callback');\n        done();\n        simulateScroll(window.innerHeight * 2);\n    }, 100);\n\n    setTimeout(function(){\n        assert.equal(sectionLoaded[2], true, 'We expect section 3 be loaded');\n        assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect only section 3 to be loaded');\n        assert.equal(afterLoad, 'null, 3', 'We expect the right values for the callback');\n        done();\n    }, 100*2);\n});\n\nQUnit.test('Testing afterLoad when autoScrolling:false on scroll with section and anchors', function(assert) {\n    var id = '#fullpage-sections-and-slides-with-data-anchor';\n    var done = assert.async(1);\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, autoScrolling: false, v2compatible: true}));\n\n    simulateScroll(window.innerHeight);\n\n    setTimeout(function(){\n        assert.equal(afterLoad, 'page2, 2', 'We expect the right values for the callback');\n        done();\n    }, 100);\n});\n\nQUnit.test('Testing afterLoad callback with fullpage-2nd-active-section', function(assert) {\n    var id = '#fullpage-2nd-active-section';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    assert.equal(sectionLoaded[1], true, 'We expect section 2 to be loaded');\n    assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect 1 slide to be loaded');\n    assert.equal(afterLoad, 'null, 2', 'We expect the right values for the callback');\n});\n\n//this test should be reviewed.\n//at the moment the afterLoad callback doesn't get fired on page load, no matter what\n//section is active by default. But... Probably it should...\n//Same as afterSlideLoad on section change\nQUnit.test('Testing afterLoad callback with fullpage-first-slide-active-in-2nd-section', function(assert) {\n    var id = '#fullpage-first-slide-active-in-2nd-section';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    assert.equal(sectionLoaded[0], true, 'We expect section 1 to be loaded');\n    assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect 0 sections to be loaded');\n    assert.equal(afterLoad, 'null, 1', 'We expect no values for the callback');\n});\n\n\n//this test should be reviewed.\n//CALLBACKS ARE NOT CONSISTENT. Rather we fire afterload on all page loads or in none.\n//This one is firing while none of the others are\nQUnit.test('Testing afterLoad callback with fullpage-middle-slide-active-in-2nd-section', function(assert) {\n    var id = '#fullpage-middle-slide-active-in-2nd-section';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    assert.equal(sectionLoaded[1], false, 'We expect section 2 be loaded');\n    assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect only 2 section to be loaded');\n    assert.equal(afterLoad, 'null, 1', 'We expect the right values for the callback');\n});\n\n// onLeave\n// ---------------------------------------\nQUnit.test('Testing onLeave callback on scroll with section', function(assert) {\n    var id = '#fullpage-no-slides';\n    var done = assert.async(2);\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    FP.moveSectionDown();\n\n    setTimeout(function(){\n        assert.equal(sectionLoaded[0], false, 'We expect section 1 to not be loaded anymore');\n        assert.equal(onLeave, '1, 2, down', 'We expect the right values for the callback');\n        done();\n        FP.moveSectionDown();\n    }, 100);\n\n    setTimeout(function(){\n        assert.equal(sectionLoaded[1], false, 'We expect section 2 to not be loaded anymore');\n        assert.equal(onLeave, '2, 3, down', 'We expect the right values for the callback');\n        done();\n    }, 100*2);\n});\n\nQUnit.test('Testing onLeave does not get fired on page load', function(assert) {\n    var id = '#fullpage-no-slides';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    assert.equal(onLeave, '', 'We expect no values for the callback');\n});\n\nQUnit.test('Testing onLeave when autoScrolling:false', function(assert) {\n    var id = '#fullpage';\n    var done = assert.async(2);\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, autoScrolling:false, v2compatible: true}));\n\n    //simulating scroll event\n    simulateScroll(window.innerHeight);\n\n    setTimeout(function(){\n        assert.equal(sectionLoaded[0], false, 'We expect section 1 to not be loaded anymore');\n        assert.equal(onLeave, '1, 2, down', 'We expect the right values for the callback');\n        done();\n        simulateScroll(window.innerHeight * 2);\n    }, 100);\n\n    setTimeout(function(){\n        assert.equal(sectionLoaded[1], false, 'We expect section 2 to not be loaded anymore');\n        assert.equal(onLeave, '2, 3, down', 'We expect the right values for the callback');\n        done();\n    }, 100*2);});\n\n\nQUnit.test('Testing onLeave when autoScrolling:false with section and anchors', function(assert) {\n    var id = '#fullpage-sections-and-slides-with-data-anchor';\n    var done = assert.async(1);\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, autoScrolling:false, v2compatible: true}));\n\n    simulateScroll(window.innerHeight);\n\n    setTimeout(function(){\n        assert.equal(afterLoad, 'page2, 2', 'We expect the right values for the callback');\n        done();\n    }, 100);\n});\n\n// afterResponsive\n// ---------------------------------------\nQUnit.test('Testing afterResponsive', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    assert.equal(afterResponsive, false, 'We expect afterResponsive callback was not fired');\n\n    FP.setResponsive(true);\n    assert.equal(afterResponsive, true, 'We expect afterResponsive callback to be fired with true value');\n\n    FP.setResponsive(false);\n    assert.equal(afterResponsive, false, 'We expect afterResponsive callback to be fired with false value');\n});\n\n\n// afterResize\n// ---------------------------------------\nQUnit.test('Testing afterResize', function(assert) {\n    var id = '#fullpage';\n    var done = assert.async(1);\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    //emulating window's resize\n    window.innerHeight = 100;\n    window.dispatchEvent(new Event('resize'));\n    assert.equal(afterResize, false, 'We expect afterResize to not get fired synchronously');\n\n    setTimeout(function(){\n        assert.equal(afterResize, true, 'We expect afterResize to get fired with some delay');\n        done();\n    }, 450);\n});\n\n\n// afterReBuild\n// ---------------------------------------\nQUnit.test('Testing afterReBuild', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {scrollingSpeed: 50, v2compatible:true}));\n\n    assert.equal(afterReBuild, false, 'We expect afterReBuild to not get fired by default');\n    FP.reBuild();\n    assert.equal(afterReBuild, true, 'We expect afterReBuild to get fired synchronously');\n});"
  },
  {
    "path": "tests/unit/callbacksV3.js",
    "content": "// onSlideLeave\n// ---------------------------------------\nQUnit.test('Testing onSlideLeave callback v3 fullpage-moveSlideRight', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {v2compatible: false, scrollingSpeed: 50}));\n    var done = assert.async(3);\n    var i;\n    var cont = 0;\n\n    for(i = 0; i < 3; i++, cont++){\n        \n        afterMove(i);\n    }\n\n    function afterMove(i){\n        console.log(\"-----------------  \" + i);\n        FP.moveSlideRight();\n\n        assert.equal(onSlideLeave.section.index, 0, 'We expect section index to be correct');\n        assert.equal(onSlideLeave.section.anchor, null, 'We expect section anchor to be correct');\n        assert.equal(onSlideLeave.section.isFirst, true, 'We expect section isFirst to be correct');\n        assert.equal(onSlideLeave.section.isLast, false, 'We expect section isLast to be correct');\n\n        assert.equal(onSlideLeave.origin.index, i, 'We expect the origin index to be correct');\n        assert.equal(onSlideLeave.origin.anchor, 'slide'+(i+1), 'We expect origin anchor to be correct');\n\n        assert.equal(onSlideLeave.destination.index, i +1, 'We expect destination index to be correct');\n        assert.equal(onSlideLeave.destination.anchor, 'slide'+(i+2), 'We expect destination anchor to be correct');\n        assert.equal(onSlideLeave.destination.isLast, i === 2, 'We expect destination isLast to be correct');\n        assert.equal(onSlideLeave.destination.isFirst, false, 'We expect destination isFirst to be correct');\n\n        assert.equal(onSlideLeave.direction, 'right', 'We expect direction to be correct');\n        done();\n    }\n});\n\n\nQUnit.test('Testing onSlideLeave callback v3 fullpage-moveSlideRight with anchors', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({scrollingSpeed: 50}, allBasicOptionsV3, sectionsAndSlidesCallbacksV3, {v2compatible: false}));\n    var done = assert.async(3);\n    var i;\n    var cont = 0;\n\n    for(i = 0; i < 3; i++, cont++){\n        setTimeout(afterMove.bind(null, i), cont * 100);\n    }\n\n    function afterMove(i){\n        FP.moveSlideRight();\n\n        assert.equal(onSlideLeave.section.index, 0, 'We expect section index to be correct');\n        assert.equal(onSlideLeave.section.anchor, 'page1', 'We expect section anchor to be correct');\n        assert.equal(onSlideLeave.section.isFirst, true, 'We expect section isFirst to be correct');\n        assert.equal(onSlideLeave.section.isLast, false, 'We expect section isLast to be correct');\n\n        assert.equal(onSlideLeave.origin.index, i, 'We expect the origin index to be correct');\n        assert.equal(onSlideLeave.origin.anchor, 'slide'+(i+1), 'We expect origin anchor to be correct');\n\n        assert.equal(onSlideLeave.direction, 'right', 'We expect direction to be correct');\n\n        assert.equal(onSlideLeave.destination.index, i +1, 'We expect destination index to be correct');\n        assert.equal(onSlideLeave.destination.anchor, 'slide'+(i+2), 'We expect destination anchor to be correct');\n        assert.equal(onSlideLeave.destination.isLast, i == 2, 'We expect destination isLast to be correct');\n        assert.equal(onSlideLeave.destination.isFirst, false, 'We expect destination isFirst to be correct');\n        done();\n    }\n});\n\n\nQUnit.test('Testing onSlideLeave callback v3 fullpage-moveSlideLeft', function(assert) {\n    var id = '#fullpage-moveSlideLeft';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {v2compatible: false, scrollingSpeed: 50}));\n    var done = assert.async(3);\n    var i;\n    var cont = 0;\n\n    for(i = 2; i >= 0; i--, cont++){\n        setTimeout(afterMove.bind(null, i), cont * 100);\n    }\n\n    function afterMove(i){\n        FP.moveSlideLeft();\n\n        assert.equal(onSlideLeave.section.index, 0, 'We expect section index to be correct');\n        assert.equal(onSlideLeave.section.anchor, null, 'We expect section anchor to be correct');\n        assert.equal(onSlideLeave.section.isFirst, true, 'We expect section isFirst to be correct');\n        assert.equal(onSlideLeave.section.isLast, false, 'We expect section isLast to be correct');\n\n        assert.equal(onSlideLeave.origin.index, i + 1, 'We expect the origin index to be correct');\n        assert.equal(onSlideLeave.origin.anchor, null, 'We expect origin anchor to be correct');\n\n        assert.equal(onSlideLeave.destination.index, i, 'We expect destination index to be correct');\n        assert.equal(onSlideLeave.destination.anchor, null, 'We expect destination anchor to be correct');\n\n        assert.equal(onSlideLeave.direction, 'left', 'We expect direction to be correct');\n        done();\n    }\n});\n\n\nQUnit.test('Testing onSlideLeave v3 from last slide to first with loopHorizontal', function(assert) {\n    var id = '#fullpage-moveSlideLeft';\n    var FP = initFullpageNew(id, Object.assign({scrollingSpeed: 50}, sectionsAndSlidesCallbacksV3, {loopHorizontal: true}));\n\n    FP.moveSlideRight();\n\n    assert.equal(onSlideLeave.section.index, 0, 'We expect section index to be correct');\n    assert.equal(onSlideLeave.section.anchor, null, 'We expect section anchor to be correct');\n    assert.equal(onSlideLeave.section.isFirst, true, 'We expect section isFirst to be correct');\n    assert.equal(onSlideLeave.section.isLast, false, 'We expect section isLast to be correct');\n\n    assert.equal(onSlideLeave.origin.index, 3, 'We expect the origin index to be correct');\n    assert.equal(onSlideLeave.origin.anchor, null, 'We expect origin anchor to be correct');\n\n    assert.equal(onSlideLeave.destination.index, 0, 'We expect destination index to be correct');\n    assert.equal(onSlideLeave.destination.isFirst, true, 'We expect isFirst to be correct');\n    assert.equal(onSlideLeave.destination.isLast, false, 'We expect isLast to be correct');\n\n    assert.equal(onSlideLeave.direction, 'right', 'We expect direction to be correct');\n});\n\n\nQUnit.test('Testing onSlideLeave v3 from 1st slide to last', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {loopHorizontal: true}));\n\n    FP.moveSlideLeft();\n\n    assert.equal(onSlideLeave.section.index, 0, 'We expect section index to be correct');\n    assert.equal(onSlideLeave.section.anchor, null, 'We expect section anchor to be correct');\n    assert.equal(onSlideLeave.section.isFirst, true, 'We expect section isFirst to be correct');\n    assert.equal(onSlideLeave.section.isLast, false, 'We expect section isLast to be correct');\n\n    assert.equal(onSlideLeave.origin.index, 0, 'We expect the origin index to be correct');\n    assert.equal(onSlideLeave.origin.anchor, 'slide1', 'We expect origin anchor to be correct');\n\n    assert.equal(onSlideLeave.destination.index, 3, 'We expect destination index to be correct');\n    assert.equal(onSlideLeave.destination.anchor, 'slide4', 'We expect destination anchor to be correct');\n    assert.equal(onSlideLeave.destination.isFirst, false, 'We expect destination isFirst to be correct');\n    assert.equal(onSlideLeave.destination.isLast, true, 'We expect destination isLast to be correct');\n\n    assert.equal(onSlideLeave.direction, 'left', 'We expect direction to be correct');\n});\n\n\n// // afterSlideLoad\n// // ---------------------------------------\n// QUnit.test('Testing afterSlideLoad callback v3', function(assert) {\n//     var id = '#fullpage-moveSlideRight';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n\n//     var done = assert.async(1);\n\n//     FP.moveSlideRight();\n\n//     assert.equal(slideLoaded[0], false, 'We expect slide 1.1 to not be loaded');\n//     assert.equal(slideLoaded[1], false, 'We expect slide 1.2 to not be loaded');\n//     assert.equal(areOthersLoaded(slideLoaded), 0, 'We expect 0 slides to be loaded');\n\n//     setTimeout(function(){\n//         assert.equal(slideLoaded[1], true, 'We expect slide 1.2 to be loaded');\n//         assert.equal(areOthersLoaded(slideLoaded), 1, 'We expect only 1 slide to be loaded');\n\n//         assert.equal(afterSlideLoad.section.index, 0, 'We expect section index to be correct');\n//         assert.equal(afterSlideLoad.section.anchor, null, 'We expect section anchor to be correct');\n//         assert.equal(afterSlideLoad.section.isFirst, true, 'We expect section isFirst to be correct');\n//         assert.equal(afterSlideLoad.section.isLast, false, 'We expect section isLast to be correct');\n\n//         assert.equal(afterSlideLoad.destination.index, 1, 'We expect destination index to be correct');\n//         assert.equal(afterSlideLoad.destination.anchor, 'slide2', 'We expect destination anchor to be correct');\n//         assert.equal(afterSlideLoad.destination.isFirst, false, 'We expect destination isFirst to be correct');\n//         assert.equal(afterSlideLoad.destination.isLast, false, 'We expect destination isLast to be correct');\n\n//         assert.equal(afterSlideLoad.origin.index, 0, 'We expect origin index to be correct');\n//         assert.equal(afterSlideLoad.origin.anchor, 'slide1', 'We expect origin anchor to be correct');\n//         assert.equal(afterSlideLoad.origin.isFirst, true, 'We expect origin isFirst to be correct');\n//         assert.equal(afterSlideLoad.origin.isLast, false, 'We expect origin isLast to be correct');\n\n//         assert.equal(afterSlideLoad.direction, 'right', 'We expect direction to be correct');\n\n//         done();\n//     }, 100);\n// });\n\n\n// QUnit.test('Testing afterSlideLoad callback v3 with anchors', function(assert) {\n//     var id = '#fullpage-moveSlideRight';\n//     var FP = initFullpageNew(id, Object.assign({scrollingSpeed:50}, allBasicOptionsV3, sectionsAndSlidesCallbacksV3));\n\n//     var done = assert.async(1);\n\n//     FP.moveSlideRight();\n\n//     setTimeout(function(){\n//         assert.equal(afterSlideLoad.section.index, 0, 'We expect section index to be correct');\n//         assert.equal(afterSlideLoad.section.anchor, 'page1', 'We expect section anchor to be correct');\n//         assert.equal(afterSlideLoad.section.isFirst, true, 'We expect section isFirst to be correct');\n//         assert.equal(afterSlideLoad.section.isLast, false, 'We expect section isLast to be correct');\n\n//         assert.equal(afterSlideLoad.destination.index, 1, 'We expect destination index to be correct');\n//         assert.equal(afterSlideLoad.destination.anchor, 'slide2', 'We expect destination anchor to be correct');\n//         assert.equal(afterSlideLoad.destination.isFirst, false, 'We expect isFirst to be correct');\n//         assert.equal(afterSlideLoad.destination.isLast, false, 'We expect isLast to be correct');\n\n//         assert.equal(afterSlideLoad.origin.index, 0, 'We expect origin index to be correct');\n//         assert.equal(afterSlideLoad.origin.anchor, 'slide1', 'We expect origin anchor to be correct');\n//         assert.equal(afterSlideLoad.origin.isFirst, true, 'We expect origin isFirst to be correct');\n//         assert.equal(afterSlideLoad.origin.isLast, false, 'We expect origin isLast to be correct');\n\n//         assert.equal(afterSlideLoad.direction, 'right', 'We expect direction to be correct');\n//         done();\n//     }, 100);\n// });\n\n\n\n// //this test should be reviewed.\n// //at the moment the afterSlideLoad callback doesn't get fired on page load, no matter what\n// //section is active by default. But... Probably it should...\n// QUnit.test('Testing afterSlideLoad callback v3 with active 2nd section and 1st slide active', function(assert) {\n//     var id = '#fullpage-first-slide-active-in-2nd-active-section';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n\n//     assert.equal(slideLoaded[1], false, 'We expect section 2 to not be loaded');\n//     assert.equal(areOthersLoaded(slideLoaded), 0, 'We expect 0 slides to be loaded');\n//     assert.equal(afterSlideLoad, '', 'We expect no values for the callback');\n// });\n\n\n\n// //this test should be reviewed.\n// //at the moment the afterSlideLoad callback doesn't get fired on page load, no matter what\n// //section is active by default. But... Probably it should...\n// QUnit.test('Testing afterSlideLoad callback v3 with active 2nd section and middle slide active', function(assert) {\n//     var id = '#fullpage-middle-slide-active-in-2nd-active-section';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n\n//     assert.equal(slideLoaded[1], false, 'We expect middle slide to not be loaded');\n//     assert.equal(areOthersLoaded(slideLoaded), 0, 'We expect 0 slides to be loaded');\n//     assert.equal(afterSlideLoad, '', 'We expect no values for the afterSlideLoad callback');\n// });\n\n\n// //this test should be reviewed.\n// //at the moment the afterSlideLoad callback doesn't get fired on page load, no matter what\n// //section is active by default. But... Probably it should...\n// QUnit.test('Testing afterSlideLoad callback v3 with active 2nd section and single slide active', function(assert) {\n//     var id = '#fullpage-single-slide-in-second-section';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n\n//     assert.equal(slideLoaded[0], false, 'We expect the single slide to not be loaded');\n//     assert.equal(areOthersLoaded(slideLoaded), 0, 'We expect 0 sections to be loaded');\n//     assert.equal(afterSlideLoad, '', 'We expect no values for the callback');\n// });\n\n\n// // afterRender\n// // ---------------------------------------\n// QUnit.test('Testing afterRender callback v3 with section', function(assert) {\n//     var id = '#fullpage';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n\n//     assert.equal(sectionLoaded[0], true, 'We expect section 1 be loaded');\n//     assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect only 1 section to be loaded');\n// });\n\n// QUnit.test('Testing afterRender callback v3 with slides', function(assert) {\n//     var id = '#fullpage-moveSlideRight';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n\n//     assert.deepEqual(afterRender, [0, 0], 'We expect Section 0.0 be loaded');\n// });\n\n// QUnit.test('Testing afterRender callback v3 on fullpage-2nd-active-section', function(assert) {\n//     var id = '#fullpage-2nd-active-section';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n//     assert.deepEqual(afterRender, [1, -1], 'We expect Section 1 be loaded');\n// });\n\n// QUnit.test('Testing afterRender callback v3 on fullpage-middle-slide-active-in-2nd-active-section', function(assert) {\n//     var id = '#fullpage-2nd-active-section';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n//     assert.deepEqual(afterRender, [1, -1], 'We expect Section 1.1 be loaded');\n// });\n\n// QUnit.test('Testing afterRender callback v3 on fullpage-first-slide-active-in-2nd-active-section', function(assert) {\n//     var id = '#fullpage-first-slide-active-in-2nd-active-section';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n//     assert.deepEqual(afterRender, [1, 0], 'We expect Section 1.0 be loaded');\n// });\n\n// QUnit.test('Testing afterRender callback v3 on fullpage-sigle-slide-active-in-2nd-active-section', function(assert) {\n//     var id = '#fullpage-sigle-slide-active-in-2nd-active-section';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n//     assert.deepEqual(afterRender, [1, 0], 'We expect Section 1.0 be loaded');\n// });\n\n\n\n// afterLoad\n// ---------------------------------------\nQUnit.test('Testing afterLoad callback v3 on scroll with section', function(assert) {\n    var id = '#fullpage-no-slides';\n    var done = assert.async(2);\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n\n    FP.moveSectionDown();\n\n    setTimeout(function(){\n        assert.equal(sectionLoaded[1], true, 'We expect section 2 be loaded');\n        assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect only 2 section to be loaded');\n\n        assert.equal(afterLoad.destination.index, 1, 'We expect section index to be correct');\n        assert.equal(afterLoad.destination.anchor, null, 'We expect section anchor to be correct');\n        assert.equal(afterLoad.destination.isFirst, false, 'We expect section isFirst to be correct');\n        assert.equal(afterLoad.destination.isLast, false, 'We expect section isLast to be correct');\n\n        assert.equal(afterLoad.origin.index, 0, 'We expect origin index to be correct');\n        assert.equal(afterLoad.origin.anchor, null, 'We expect origin anchor to be correct');\n        assert.equal(afterLoad.origin.isFirst, true, 'We expect isFirst to be correct');\n        assert.equal(afterLoad.origin.isLast, false, 'We expect isLast to be correct');\n\n        assert.equal(afterLoad.direction, 'down', 'We expect isLast to be correct');\n\n        done();\n        FP.moveSectionDown();\n    }, 100);\n\n    setTimeout(function(){\n        assert.equal(sectionLoaded[2], true, 'We expect section 3 be loaded');\n        assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect only section 3 to be loaded');\n\n        assert.equal(afterLoad.destination.index, 2, 'We expect section index to be correct');\n        assert.equal(afterLoad.destination.anchor, null, 'We expect section anchor to be correct');\n        assert.equal(afterLoad.destination.isFirst, false, 'We expect section isFirst to be correct');\n        assert.equal(afterLoad.destination.isLast, false, 'We expect section isLast to be correct');\n\n        assert.equal(afterLoad.origin.index, 1, 'We expect origin index to be correct');\n        assert.equal(afterLoad.origin.anchor, null, 'We expect origin anchor to be correct');\n        assert.equal(afterLoad.origin.isFirst, false, 'We expect isFirst to be correct');\n        assert.equal(afterLoad.origin.isLast, false, 'We expect isLast to be correct');\n\n        assert.equal(afterLoad.direction, 'down', 'We expect isLast to be correct');\n        done();\n    }, 100*2);\n});\n\n\n// QUnit.test('Testing afterLoad callback v3 on scroll with section and anchors', function(assert) {\n//     var id = '#fullpage-sections-and-slides-with-data-anchor';\n//     var done = assert.async(1);\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n\n//     FP.moveSectionDown();\n\n//     setTimeout(function(){\n\n//         assert.equal(afterLoad.destination.index, 1, 'We expect section index to be correct');\n//         assert.equal(afterLoad.destination.anchor, 'page2', 'We expect section anchor to be correct');\n//         assert.equal(afterLoad.destination.isFirst, false, 'We expect section isFirst to be correct');\n//         assert.equal(afterLoad.destination.isLast, false, 'We expect section isLast to be correct');\n\n//         assert.equal(afterLoad.origin.index, 0, 'We expect origin index to be correct');\n//         assert.equal(afterLoad.origin.anchor, 'page1', 'We expect origin anchor to be correct');\n//         assert.equal(afterLoad.origin.isFirst, true, 'We expect isFirst to be correct');\n//         assert.equal(afterLoad.origin.isLast, false, 'We expect isLast to be correct');\n\n//         done();\n//         FP.moveSectionDown();\n//     }, 100);\n// });\n\n// QUnit.test('Testing afterLoad v3 when autoScrolling:false with section', function(assert) {\n//     var id = '#fullpage-no-slides';\n//     var done = assert.async(2);\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50, autoScrolling:false}));\n\n//     simulateScroll(window.innerHeight);\n\n//     setTimeout(function(){\n//         assert.equal(sectionLoaded[1], true, 'We expect section 2 be loaded');\n//         assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect only 2 section to be loaded');\n\n//         assert.equal(afterLoad.destination.index, 1, 'We expect section index to be correct');\n//         assert.equal(afterLoad.destination.anchor, null, 'We expect section anchor to be correct');\n//         assert.equal(afterLoad.destination.isFirst, false, 'We expect section isFirst to be correct');\n//         assert.equal(afterLoad.destination.isLast, false, 'We expect section isLast to be correct');\n\n//         console.warn(afterLoad);\n//         assert.equal(afterLoad.origin.index, 0, 'We expect origin index to be correct');\n//         assert.equal(afterLoad.origin.anchor, null, 'We expect origin anchor to be correct');\n//         assert.equal(afterLoad.origin.isFirst, true, 'We expect isFirst to be correct');\n//         assert.equal(afterLoad.origin.isLast, false, 'We expect isLast to be correct');\n\n//         assert.equal(afterLoad.direction, 'down', 'We expect isLast to be correct');\n\n//         done();\n//         simulateScroll(window.innerHeight * 2);\n//     }, 100);\n\n//     setTimeout(function(){\n//         assert.equal(sectionLoaded[2], true, 'We expect section 3 be loaded');\n//         assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect only section 3 to be loaded');\n\n//         assert.equal(afterLoad.destination.index, 2, 'We expect section index to be correct');\n//         assert.equal(afterLoad.destination.anchor, null, 'We expect section anchor to be correct');\n//         assert.equal(afterLoad.destination.isFirst, false, 'We expect section isFirst to be correct');\n//         assert.equal(afterLoad.destination.isLast, false, 'We expect section isLast to be correct');\n\n//         assert.equal(afterLoad.origin.index, 1, 'We expect origin index to be correct');\n//         assert.equal(afterLoad.origin.anchor, null, 'We expect origin anchor to be correct');\n//         assert.equal(afterLoad.origin.isFirst, false, 'We expect isFirst to be correct');\n//         assert.equal(afterLoad.origin.isLast, false, 'We expect isLast to be correct');\n\n//         assert.equal(afterLoad.direction, 'down', 'We expect isLast to be correct');\n//         done();\n//     }, 100*2);\n// });\n\n\n// QUnit.test('Testing afterLoad v3 when autoScrollingkey: \"value\", false with section and anchors', function(assert) {\n//     var id = '#fullpage-sections-and-slides-with-data-anchor';\n//     var done = assert.async(1);\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50, autoScrolling:false}));\n\n//      simulateScroll(window.innerHeight);\n\n//     setTimeout(function(){\n\n//         assert.equal(afterLoad.destination.index, 1, 'We expect section index to be correct');\n//         assert.equal(afterLoad.destination.anchor, 'page2', 'We expect section anchor to be correct');\n//         assert.equal(afterLoad.destination.isFirst, false, 'We expect section isFirst to be correct');\n//         assert.equal(afterLoad.destination.isLast, false, 'We expect section isLast to be correct');\n\n//         assert.equal(afterLoad.origin.index, 0, 'We expect origin index to be correct');\n//         assert.equal(afterLoad.origin.anchor, 'page1', 'We expect origin anchor to be correct');\n//         assert.equal(afterLoad.origin.isFirst, true, 'We expect isFirst to be correct');\n//         assert.equal(afterLoad.origin.isLast, false, 'We expect isLast to be correct');\n\n//         done();\n//     }, 100);\n// });\n\n\n// QUnit.test('Testing afterLoad callback v3 with fullpage-2nd-active-section', function(assert) {\n//     var id = '#fullpage-2nd-active-section';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n\n//     assert.equal(sectionLoaded[1], true, 'We expect section 2 to be loaded');\n//     assert.equal(afterLoad.destination.anchor, null, 'We expect section anchor to be correct');\n//     assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect 1 slide to be loaded');\n//     assert.equal(afterLoad.destination.index, 1, 'We expect no values for the callback');\n//     assert.equal(afterLoad.destination.isFirst, false, 'We expect section isFirst to be correct');\n//     assert.equal(afterLoad.destination.isLast, false, 'We expect section isLast to be correct');\n// });\n\n\n// QUnit.test('Testing afterLoad callback v3 with fullpage-first-slide-active-in-2nd-section', function(assert) {\n//     var id = '#fullpage-first-slide-active-in-2nd-section';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n\n//     assert.equal(sectionLoaded[0], true, 'We expect section 1 to be loaded');\n//     assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect 0 sections to be loaded');\n\n//     assert.equal(afterLoad.destination.index, 0, 'We expect section index to be correct');\n//     assert.equal(afterLoad.destination.anchor, null, 'We expect section anchor to be correct');\n//     assert.equal(afterLoad.destination.isFirst, true, 'We expect section isFirst to be correct');\n//     assert.equal(afterLoad.destination.isLast, false, 'We expect section isLast to be correct');\n\n//     assert.equal(afterLoad.origin.index, 0, 'We expect section index to be correct');\n//     assert.equal(afterLoad.origin.anchor, null, 'We expect section anchor to be correct');\n//     assert.equal(afterLoad.origin.isFirst, true, 'We expect section isFirst to be correct');\n//     assert.equal(afterLoad.origin.isLast, false, 'We expect section isLast to be correct');\n\n//     assert.equal(afterLoad.direction, null, 'We expect section direction to be correct');\n// });\n\n\n// QUnit.test('Testing afterLoad callback v3 with fullpage-middle-slide-active-in-2nd-section', function(assert) {\n//     var id = '#fullpage-middle-slide-active-in-2nd-section';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n\n//     assert.equal(sectionLoaded[1], false, 'We expect section 2 be loaded');\n//     assert.equal(areOthersLoaded(sectionLoaded), 1, 'We expect only 2 section to be loaded');\n\n//     assert.equal(afterLoad.destination.index, 0, 'We expect section index to be correct');\n//     assert.equal(afterLoad.destination.anchor, null, 'We expect section anchor to be correct');\n//     assert.equal(afterLoad.destination.isFirst, true, 'We expect section isFirst to be correct');\n//     assert.equal(afterLoad.destination.isLast, false, 'We expect section isLast to be correct');\n\n//     assert.equal(afterLoad.origin.index, 0, 'We expect section index to be correct');\n//     assert.equal(afterLoad.origin.anchor, null, 'We expect section anchor to be correct');\n//     assert.equal(afterLoad.origin.isFirst, true, 'We expect section isFirst to be correct');\n//     assert.equal(afterLoad.origin.isLast, false, 'We expect section isLast to be correct');\n\n//     assert.equal(afterLoad.direction, null, 'We expect section direction to be correct');\n// });\n\n\n// // onLeave\n// // ---------------------------------------\n// QUnit.test('Testing onLeave callback v3 on scroll with section', function(assert) {\n//     var id = '#fullpage-no-slides';\n//     var done = assert.async(2);\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n\n//     FP.moveSectionDown();\n\n//     setTimeout(function(){\n//         assert.equal(sectionLoaded[0], false, 'We expect section 1 to not be loaded anymore');\n\n//         assert.equal(afterLoad.destination.index, 1, 'We expect section index to be correct');\n//         assert.equal(afterLoad.destination.anchor, null, 'We expect section anchor to be correct');\n//         assert.equal(afterLoad.destination.isFirst, false, 'We expect section isFirst to be correct');\n//         assert.equal(afterLoad.destination.isLast, false, 'We expect section isLast to be correct');\n\n//         assert.equal(afterLoad.origin.index, 0, 'We expect origin index to be correct');\n//         assert.equal(afterLoad.origin.anchor, null, 'We expect origin anchor to be correct');\n//         assert.equal(afterLoad.origin.isFirst, true, 'We expect isFirst to be correct');\n//         assert.equal(afterLoad.origin.isLast, false, 'We expect isLast to be correct');\n\n//         assert.equal(afterLoad.direction, 'down', 'We expect isLast to be correct');\n\n//         done();\n//         FP.moveSectionDown();\n//     }, 100);\n\n//     setTimeout(function(){\n//         assert.equal(sectionLoaded[1], false, 'We expect section 2 to not be loaded anymore');\n\n//         assert.equal(afterLoad.destination.index, 2, 'We expect section index to be correct');\n//         assert.equal(afterLoad.destination.anchor, null, 'We expect section anchor to be correct');\n//         assert.equal(afterLoad.destination.isFirst, false, 'We expect section isFirst to be correct');\n//         assert.equal(afterLoad.destination.isLast, false, 'We expect section isLast to be correct');\n\n//         assert.equal(afterLoad.origin.index, 1, 'We expect origin index to be correct');\n//         assert.equal(afterLoad.origin.anchor, null, 'We expect origin anchor to be correct');\n//         assert.equal(afterLoad.origin.isFirst, false, 'We expect isFirst to be correct');\n//         assert.equal(afterLoad.origin.isLast, false, 'We expect isLast to be correct');\n\n//         assert.equal(afterLoad.direction, 'down', 'We expect isLast to be correct');\n//         done();\n//     }, 100*2);\n// });\n\n// QUnit.test('Testing onLeave v3 when autoScrolling:false with section', function(assert) {\n//     var id = '#fullpage-no-slides';\n//     var done = assert.async(2);\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50, autoScrolling:false}));\n\n//     simulateScroll(window.innerHeight);\n\n//     setTimeout(function(){\n//         assert.equal(sectionLoaded[0], false, 'We expect section 1 to not be loaded anymore');\n\n//         assert.equal(afterLoad.destination.index, 1, 'We expect section index to be correct');\n//         assert.equal(afterLoad.destination.anchor, null, 'We expect section anchor to be correct');\n//         assert.equal(afterLoad.destination.isFirst, false, 'We expect section isFirst to be correct');\n//         assert.equal(afterLoad.destination.isLast, false, 'We expect section isLast to be correct');\n\n//         assert.equal(afterLoad.origin.index, 0, 'We expect origin index to be correct');\n//         assert.equal(afterLoad.origin.anchor, null, 'We expect origin anchor to be correct');\n//         assert.equal(afterLoad.origin.isFirst, true, 'We expect isFirst to be correct');\n//         assert.equal(afterLoad.origin.isLast, false, 'We expect isLast to be correct');\n\n//         assert.equal(afterLoad.direction, 'down', 'We expect isLast to be correct');\n\n//         done();\n//         simulateScroll(window.innerHeight * 2);\n//     }, 100);\n\n//     setTimeout(function(){\n//         assert.equal(sectionLoaded[1], false, 'We expect section 2 to not be loaded anymore');\n\n//         assert.equal(afterLoad.destination.index, 2, 'We expect section index to be correct');\n//         assert.equal(afterLoad.destination.anchor, null, 'We expect section anchor to be correct');\n//         assert.equal(afterLoad.destination.isFirst, false, 'We expect section isFirst to be correct');\n//         assert.equal(afterLoad.destination.isLast, false, 'We expect section isLast to be correct');\n\n//         assert.equal(afterLoad.origin.index, 1, 'We expect origin index to be correct');\n//         assert.equal(afterLoad.origin.anchor, null, 'We expect origin anchor to be correct');\n//         assert.equal(afterLoad.origin.isFirst, false, 'We expect isFirst to be correct');\n//         assert.equal(afterLoad.origin.isLast, false, 'We expect isLast to be correct');\n\n//         assert.equal(afterLoad.direction, 'down', 'We expect isLast to be correct');\n//         done();\n//     }, 100*2);\n// });\n\n// QUnit.test('Testing onLeave v3 does not get fired on page load', function(assert) {\n//     var id = '#fullpage-no-slides';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n\n//     assert.equal(onLeave, '', 'We expect no values for the callback');\n// });\n\n// QUnit.test('Testing onLeave when autoScrolling:false with section and anchors', function(assert) {\n//     var id = '#fullpage-sections-and-slides-with-data-anchor';\n//     var done = assert.async(1);\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50, autoScrolling:false}));\n\n//     simulateScroll(window.innerHeight);\n\n//     setTimeout(function(){\n//         console.log(onLeave);\n//         assert.equal(onLeave.destination.index, 1, 'We expect section index to be correct');\n//         assert.equal(onLeave.destination.anchor, 'page2', 'We expect section anchor to be correct');\n//         assert.equal(onLeave.destination.isFirst, false, 'We expect section isFirst to be correct');\n//         assert.equal(onLeave.destination.isLast, false, 'We expect section isLast to be correct');\n\n//         assert.equal(onLeave.origin.index, 0, 'We expect origin index to be correct');\n//         assert.equal(onLeave.origin.anchor, 'page1', 'We expect origin anchor to be correct');\n//         assert.equal(onLeave.origin.isFirst, true, 'We expect isFirst to be correct');\n//         assert.equal(onLeave.origin.isLast, false, 'We expect isLast to be correct');\n\n//         done();\n//     }, 100);\n// });\n\n\n// // afterResize\n// // ---------------------------------------\n// QUnit.test('Testing afterResize', function(assert) {\n//     var id = '#fullpage';\n//     var done = assert.async(1);\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacksV3, {scrollingSpeed: 50}));\n\n//     //emulating resize event\n//     window.innerHeight = 100;\n//     window.dispatchEvent(new Event('resize'));\n//     assert.equal(afterResize, false, 'We expect afterResize to not get fired synchronously');\n\n//     setTimeout(function(){\n//         assert.equal(afterResize, `${window.innerWidth}, ${window.innerHeight}`, 'We expect afterResize to get fired with some delay');\n//         done();\n//     }, 450);\n// });\n\n"
  },
  {
    "path": "tests/unit/continuousVertical.js",
    "content": "\nQUnit.test('Testing continuousVertical:false from 1st section to last', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {continuousVertical: false, scrollingSpeed: 50});\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getTransformFromElement($(id)), ['0', '0', '0'], 'We expect sections transformation to be [0, 0, 0]');\n\n    FP.moveSectionUp();\n\n    setTimeout(function(){\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n        assert.deepEqual(getTransformFromElement($(id)), ['0', '0', '0'], 'We expect sections transformation to be [0, 0, 0]');\n        done();\n    }, 100);\n});\n\n\nQUnit.test('Testing continuousVertical:true & autoScrolling:false', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {continuousVertical: true, autoScrolling:false, scrollingSpeed: 50});\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getTransformFromElement($(id)), ['0', '0', '0'], 'We expect sections transformation to be [0, 0, 0]');\n\n    FP.moveSectionUp();\n\n    setTimeout(function(){\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n        assert.deepEqual(getTransformFromElement($(id)), ['0', '0', '0'], 'We expect sections transformation to be [0, 0, 0]');\n        done();\n    }, 100);\n});\n\n\nQUnit.test('Testing continuousVertical:true from 1st section to last', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {continuousVertical: true, scrollingSpeed: 50});\n    var windowHeight = $(window).height();\n\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getTransformFromElement($(id)), ['0', '0', '0'], 'We expect sections transformation to be [0, 0, 0]');\n\n    FP.moveSectionUp();\n\n    setTimeout(function(){\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n        assert.deepEqual(getTransformFromElement($(id)), ['0', `${-(windowHeight*3)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*3)}, 0]`);\n        done();\n    }, 100);\n});\n\nQUnit.test('Testing continuousVertical:true scroll normal down', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {continuousVertical: true, scrollingSpeed: 50});\n    var windowHeight = $(window).height();\n\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getTransformFromElement($(id)), ['0', '0', '0'], 'We expect sections transformation to be [0, 0, 0]');\n\n    FP.moveSectionDown();\n\n    setTimeout(function(){\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n        assert.deepEqual(getTransformFromElement($(id)), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        done();\n    }, 100);\n});\n\nQUnit.test('Testing continuousVertical:true scroll normal up', function(assert) {\n    var id = '#fullpage-last-section-active';\n    var FP = initFullpageNew(id, {continuousVertical: true, scrollingSpeed: 50});\n    var windowHeight = $(window).height();\n\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n    assert.deepEqual(getTransformFromElement($(id)), ['0', `${-(windowHeight*3)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*3)}, 0]`);\n\n    FP.moveSectionUp();\n\n    setTimeout(function(){\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 2, 'We expect section 3 to be active');\n        assert.deepEqual(getTransformFromElement($(id)), ['0', `${-(windowHeight*2)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*2)}, 0]`);\n        done();\n    }, 100);\n});\n\n\nQUnit.test('Testing continuousVertical:false from last section to first', function(assert) {\n    var id = '#fullpage-last-section-active';\n    var FP = initFullpageNew(id, {continuousVertical: false, scrollingSpeed: 50});\n    var windowHeight = $(window).height();\n\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n    assert.deepEqual(getTransformFromElement($(id)), ['0', `${-(windowHeight*3)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*3)}, 0]`);\n\n    FP.moveSectionDown();\n\n    setTimeout(function(){\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n        assert.deepEqual(getTransformFromElement($(id)), ['0', `${-(windowHeight*3)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*3)}, 0]`);\n        done();\n    }, 100);\n});\n\n\nQUnit.test('Testing continuousVertical:true from last section to first', function(assert) {\n    var id = '#fullpage-last-section-active';\n    var FP = initFullpageNew(id, {continuousVertical: true, scrollingSpeed: 50});\n    var windowHeight = $(window).height();\n\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n    assert.deepEqual(getTransformFromElement($(id)), ['0', `${-(windowHeight*3)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*3)}, 0]`);\n\n    FP.moveSectionDown();\n\n    setTimeout(function(){\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n        assert.deepEqual(getTransformFromElement($(id)), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n        done();\n    }, 100);\n});\n\n\nQUnit.test('Testing continuousVertical:true with css3:false Checking middle slide stills in the middle', function(assert) {\n    var id = '#fullpage-middle-slide-active';\n    var FP = initFullpageNew(id, {continuousVertical: true, css3:false, scrollingSpeed: 50});\n    var windowHeight = $(window).height();\n\n    var done = assert.async(1);\n\n    function getPosition(){\n        return $(id).find(SECTION_ACTIVE_SEL).find(SLIDES_WRAPPER_SEL).scrollLeft();\n    }\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 1, 'We expect slide 1.2 to be active');\n    assert.deepEqual(getPosition(), 1000, 'We expect slides position to be 1000');\n\n    FP.moveSectionUp();\n\n    setTimeout(function(){\n        var position = $(id).find(SECTION_SEL).eq(0).find(SLIDES_WRAPPER_SEL).scrollLeft();\n        assert.equal($(id).find(SECTION_SEL).eq(0).find(SLIDE_ACTIVE_SEL).index(), 1, 'We expect slide 1.2 to be active');\n        assert.deepEqual(position, 1000, 'We expect slides position to be 1000');\n        done();\n    }, 100);\n});"
  },
  {
    "path": "tests/unit/destroy.js",
    "content": "QUnit.test('.destroy(\"all\") removes all inline CSS and fullpage classes', function(assert) {\n    var id = '#fullpage';\n\n    appendLazyElements(id);\n\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {\n        sectionsColor: ['yellow', 'green', 'purple', 'orange'],\n        paddingTop: '20px',\n        paddingBottom: '20px'\n    }));\n\n    var $SECTION_SEL = $(SECTION_SEL),\n        $SLIDE_SEL = $(SLIDE_SEL),\n        $html = $('html');\n        $body = $('body');\n\n    FP.destroy('all');\n\n    // and make sure we cleaned it up. note: this requires checking the uncomputed\n    // CSS or jQuery will give us computed values, which are unhelpful here\n    assert.equal($SECTION_SEL.get(0).style.height, '', SECTION_SEL + ' should have an empty string height');\n    assert.equal($SECTION_SEL.get(0).style.backgroundColor, '', SECTION_SEL + ' should have an empty string background-color');\n    assert.equal($SECTION_SEL.get(0).style.paddingTop, '', SECTION_SEL + ' should have an empty string paddingTop');\n    assert.equal($SECTION_SEL.get(0).style.paddingBottom, '', SECTION_SEL + ' should have an empty string paddingBottom');\n    assert.equal($SLIDE_SEL.get(0).style.width, '', SLIDE_SEL + ' should have an empty string width');\n    assert.equal($html.get(0).style.overflow, '', 'html should have an empty string overflow');\n    assert.equal($html.get(0).style.height, '', 'html should have an empty string height');\n    assert.equal($body.get(0).style.overflow, '', 'body should have an empty string overflow');\n    assert.equal($body.get(0).style.height, '', 'body should have an empty string height');\n\n    //no data-src or data-srcset should be present\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(0)), false, 'We expect no lazy elements to be loaded on 1st section');\n    assert.equal(areOthersLazyLoaded(), false, 'We expect no lazy elements to be loaded in other sections');\n\n    // check for <html/> classes\n    assert.equal($html.hasClass(ENABLED), false, 'html should not have the ' + ENABLED + ' class');\n    assert.equal($html.hasClass(RESPONSIVE), false, 'html should not have the ' + RESPONSIVE + ' class');\n\n    //destroyed\n    assert.equal($(id).hasClass(DESTROYED), true, 'fullpage.js container should have the ' + DESTROYED + ' class');\n\n    //no table classes\n    assert.equal($(id).find(TABLE_CELL_SEL).length, 0, 'Sections or slides should not containt the ' + TABLE_CELL_SEL + ' class');\n\n    //no SLIDES_CONTAINER_SEL classes\n    assert.equal($(id).find(SLIDES_CONTAINER_SEL).length, 0, 'Sections or slides should not containt the ' + SLIDES_CONTAINER_SEL + ' class');\n\n    //no SLIDES_WRAPPER_SEL classes\n    assert.equal($(id).find(SLIDES_WRAPPER_SEL).length, 0, 'Sections or slides should not containt the ' + SLIDES_WRAPPER_SEL + ' class');\n\n    //maintains original styles\n    assert.equal($(id).find('#section2')[0].style.backgroundColor, 'blue', 'Sections or slides should maintain previous inline styles');\n\n    // check for <body/> classes\n    $.each($body.get(0).className.split(/\\s+/), function(index, className) {\n        assert.equal(className.indexOf(VIEWING_PREFIX), -1, 'body should not have a ' + VIEWING_PREFIX + '-* class');\n    });\n\n    //no scrollable sections\n    assert.equal($(SECTION_SEL + ', ' + SLIDE_SEL).find(SCROLLABLE_SEL).length, 0, 'Sections or slides should not containt the ' + SCROLLABLE_SEL + ' class');\n    assert.equal($(SECTION_SEL + ', ' + SLIDE_SEL).find('.fp-scroller').length, 0, 'Sections or slides should not containt the fp-scroller class');\n\n    //arrows\n    var numArrowsAndBullets = $(document).find(SECTION_NAV_SEL + ', ' + SLIDES_NAV_SEL +  ', ' + SLIDES_ARROW_SEL).length;\n    assert.equal(numArrowsAndBullets, 0, 'html should not contain any of the bullets or arrows generated by fullPage.js');\n\n    //container transforms\n    assert.deepEqual(getTransformFromElement($(id)), ['0', '0', '0'], 'fullPage.js container should have no transformations');\n\n    //internal selectors\n    var usedSelectors = [SECTION_SEL, SLIDE_SEL, SLIDES_CONTAINER_SEL];\n    $.each(usedSelectors, function(index, value){\n        assert.equal($(id).find(value).length, 0, 'fullpage.js container should not contain any internal selectors generated by fullPage.js');\n    });\n});\n/*\nvar g_fullpageEvents = [];\n//https://gist.github.com/alessioalex/fc536ef87713d0a9ed89\n// http://stackoverflow.com/questions/4787698/failure-to-override-elements-addeventlistener-in-firefox\nfunction interceptEvents(id){\n    Error.stackTraceLimit = Infinity;\n\n    var _interfaces = Object.getOwnPropertyNames(window).filter(function(i) {\n      return /^HTML/.test(i);\n    }).map(function(i) {\n      return window[i];\n    });\n\n    // var _interfaces = [ HTMLDivElement, HTMLImageElement, HTMLUListElement, HTMLElement, HTMLDocument ];\n    for (var i = 0; i < _interfaces.length; i++) {\n      (function(original) {\n        _interfaces[i].prototype.addEventListener = function(type, listener, useCapture) {\n            g_fullpageEvents.push(listener.name);\n          console.log('addEventListener ' + type, listener, useCapture);\n          console.log('--------');\n\n          return original.apply(this, arguments);\n        }\n\n        _interfaces[i].prototype.removeEventListener = function(type, listener, useCapture) {\n            if(g_fullpageEvents){\n                var index = g_fullpageEvents.indexOf(listener.name);\n                if(index > -1){\n                    g_fullpageEvents.splice(index, 1);\n                }\n            }\n        }\n      })(_interfaces[i].prototype.addEventListener);\n    }\n}\n\nQUnit.test('.destroy(\"all\") removes all fullpage.js event listeners', function(assert) {\n    var id = '#fullpage';\n\n    interceptEvents(id);\n\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {navigation:true, slidesNavigation: true}));\n    console.warn(g_fullpageEvents);\n\n    var $SECTION_SEL = $(SECTION_SEL),\n        $SLIDE_SEL = $(SLIDE_SEL),\n        $html = $('html');\n        $body = $('body');\n\n    FP.destroy('all');\n    console.warn(g_fullpageEvents);\n\n    //adding a fake navigation\n    var nav = '<div id=\"fp-nav\" class=\"fp-right\" style=\"margin-top: -23.5px;\"><ul><li><a href=\"#page1\" class=\"active\"><span></span></a><div class=\"fp-tooltip fp-right\">nada</div></li><li><a href=\"#page2\"><span></span></a><div class=\"fp-tooltip fp-right\">demo</div></li></ul></div>';\n    $('body').append(nav);\n\n    assert.ok(true);\n});*/\n\nQUnit.test('.destroy(\"all\") with css3:false ', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {css3: false}));\n\n    assert.deepEqual($(id).css('top'), '0px', 'fullPage.js container should have top: 0');\n});\n\nQUnit.test('.destroy(\"all\") with css3:true & autoScrolling:false', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {css3: true, autoScrolling:false}));\n\n    //scrolling the content\n    $('html,body').scrollTop(600);\n\n    FP.destroy('all');\n\n    assert.deepEqual($(id).css('top'), 'auto', 'fullPage.js container should have top: auto');\n    assert.deepEqual($('html,body').scrollTop(), 0, 'fullPage.js container should have scrollTop: 0');\n});\n\nQUnit.test('.destroy(\"all\") with css3:true & scrollBar:true', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {css3: true, scrollBar: true}));\n\n    //scrolling the content\n    $('html,body').scrollTop(600);\n\n    FP.destroy('all');\n\n    assert.deepEqual($(id).css('top'), 'auto', 'fullPage.js container should have top: auto');\n    assert.deepEqual($('html,body').scrollTop(), 0, 'fullPage.js container should have scrollTop: 0');\n});\n\n//common test when fullpage.js uses scrollbar\nfunction checkDestroyWhenScrollBarPresent(assert, options){\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, options);\n\n    //scrolling the content\n    $('html,body').scrollTop(600);\n\n    FP.destroy('all');\n\n    assert.deepEqual($(id).css('top'), 'auto', 'fullPage.js container should have top: auto');\n    assert.deepEqual($('html,body').scrollTop(), 0, 'fullPage.js container should have scrollTop: 0');\n}\n\nQUnit.test('.destroy(\"all\") with css3:true & autoScrolling:false', function(assert) {\n    checkDestroyWhenScrollBarPresent(assert, Object.assign({}, allBasicOptions, {css3: true, autoScrolling:false}));\n});\n\nQUnit.test('.destroy(\"all\") with css3:true & scrollBar:true', function(assert) {\n    checkDestroyWhenScrollBarPresent(assert, Object.assign({}, allBasicOptions, {css3: true, scrollBar:true}));\n});\n\nQUnit.test('.destroy(\"all\") with css3:false & autoScrolling:false', function(assert) {\n    checkDestroyWhenScrollBarPresent(assert, Object.assign({}, allBasicOptions, {css3: false, autoScrolling:false}));\n});\n\nQUnit.test('.destroy(\"all\") with css3:false & scrollBar:true', function(assert) {\n    checkDestroyWhenScrollBarPresent(assert, Object.assign({}, allBasicOptions, {css3: false, scrollBar:true}));\n});"
  },
  {
    "path": "tests/unit/displayWarnings.js",
    "content": "\nvar oldConsole = console;\nvar warnFired = false;\nvar logFired = false;\nvar errorFired = false;\nvar licenseKey = 'OPEN-SOURCE-GPLV3-LICENSE';\n\nfunction mockConsole(){\n    console = {};\n    console.log = function(e){\n        logFired = true;\n    }\n    console.warn = function(e){\n        warnFired = true;\n    };\n    console.error = function(e){\n        errorFired = true;\n    }\n}\n\nfunction isWarnFired(){\n    if(warnFired){\n        warnFired = false;\n        return true;\n    }\n    return false;\n}\n\nfunction isErrorFired(){\n    if(errorFired){\n        errorFired = false;\n        return true;\n    }\n    return false;\n}\n\nfunction isUsingExtensionsFile(FP){\n    return typeof FP.getFullpageData().internals !== 'undefined';\n}\n\n//loopTop & continuousVertical\nQUnit.test('Testing warnings for loopTop:false with continuousVertical:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {loopTop: false, loopBottom: false, continuousVertical:true});\n    assert.equal(isWarnFired(), false, 'We expect console.warn not to be fired');\n});\n\nQUnit.test('Testing warnings for loopTop:true with continuousVertical:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {loopTop: true, continuousVertical:true});\n    assert.equal(isWarnFired(), true, 'We expect console.warn to be fired');\n});\n\n//loopBottom & continuousVertical\nQUnit.test('Testing warnings for loopBottom:false with continuousVertical:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {loopBottom: false, loopBottom: false, continuousVertical:true});\n    assert.equal(isWarnFired(), false, 'We expect console.warn not to be fired');\n});\n\nQUnit.test('Testing warnings for loopBottom:true with continuousVertical:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {loopBottom: true, continuousVertical:true});\n    assert.equal(isWarnFired(), true, 'We expect console.warn to be fired');\n});\n\n//scrollBar & continuousVertical\nQUnit.test('Testing warnings for scrollBar:false with continuousVertical:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {scrollBar: false, autoScrolling:true, continuousVertical:true});\n    assert.equal(isWarnFired(), false, 'We expect console.warn not to be fired');\n});\n\nQUnit.test('Testing warnings for scrollBar:true with continuousVertical:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {scrollBar: true, autoScrolling:true, continuousVertical:true});\n    assert.equal(isWarnFired(), true, 'We expect console.warn to be fired');\n});\n\n//scrollOverflow && (scrollBar || autoScrolling)\nQUnit.test('Testing warnings for scrollOverflow:true with scrollBar:true & autoScrolling:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {scrollBar: true, scrollOverflow:true, scrollOverflowHandler: {init: function(){}, remove: function(){}} });\n    assert.equal(isWarnFired(), true, 'We expect console.warn to be fired');\n});\n\nQUnit.test('Testing warnings for scrollOverflow:true with scrollBar:false & autoScrolling:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {scrollBar: false, scrollOverflow:true, scrollOverflowHandler: {init: function(){}, remove: function(){}} });\n    assert.equal(isWarnFired(), false, 'We expect console.warn to be fired');\n});\n\nQUnit.test('Testing warnings for scrollOverflow:true with autoScrolling:false', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {autoScrolling: false, scrollOverflow:true, scrollOverflowHandler: {init: function(){}, remove: function(){}} });\n    assert.equal(isWarnFired(), true, 'We expect console.warn to be fired');\n});\n\nQUnit.test('Testing warnings for scrollOverflow:true with autoScrolling:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {autoScrolling: true, scrollOverflow:true, scrollOverflowHandler: {init: function(){}, remove: function(){}} });\n    assert.equal(isWarnFired(), false, 'We expect console.warn not to be fired');\n});\n\n//autoScrolling & continuousVertical\nQUnit.test('Testing warnings for autoScrolling:true with continuousVertical:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {autoScrolling: true, continuousVertical:true});\n    assert.equal(isWarnFired(), false, 'We expect console.warn not to be fired');\n});\n\nQUnit.test('Testing warnings for autoScrolling:false with continuousVertical:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {autoScrolling: false, continuousVertical:true});\n    assert.equal(isWarnFired(), true, 'We expect console.warn to be fired');\n});\n\n//scrollOverflow must exist\nQUnit.test('Testing warnings for scrollOverflow:true with no vendor file', function(assert) {\n    var id = '#fullpage';\n    errorFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {scrollOverflow: true, licenseKey: licenseKey, scrollOverflowHandler: null});\n    assert.equal(isErrorFired(), true, 'We expect console.warn to be fired');\n});\n\n//scrollOverflow must exist\nQUnit.test('Testing warnings for scrollOverflow:true with vendor file', function(assert) {\n    var id = '#fullpage';\n    errorFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {scrollOverflow: true, licenseKey: licenseKey, scrollOverflowHandler: {init: function(){}, remove: function(){}}});\n    assert.equal(isWarnFired(), false, 'We expect console.warn not to be fired');\n});\n\n//extension file must exist\nQUnit.test('Testing warnings for parallax:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {parallax: true});\n    var expected = isUsingExtensionsFile(FP) ? false : true;\n\n    assert.equal(isWarnFired(), expected, 'We expect console.warn to be fired');\n});\n\nQUnit.test('Testing warnings for scrollOverflowReset:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {scrollOverflowReset: true});\n    var expected = isUsingExtensionsFile(FP) ? false : true;\n\n    assert.equal(isWarnFired(), expected, 'We expect console.warn to be fired');\n});\n\nQUnit.test('Testing warnings for dragAndMove:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {dragAndMove: true});\n    var expected = isUsingExtensionsFile(FP) ? false : true;\n\n    assert.equal(isWarnFired(), expected, 'We expect console.warn to be fired');\n});\n\nQUnit.test('Testing warnings for offsetSections:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {offsetSections: true});\n    var expected = isUsingExtensionsFile(FP) ? false : true;\n\n    assert.equal(isWarnFired(), expected, 'We expect console.warn to be fired');\n});\n\nQUnit.test('Testing warnings for fadingEffect:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {fadingEffect: true});\n    var expected = isUsingExtensionsFile(FP) ? false : true;\n\n    assert.equal(isWarnFired(), expected, 'We expect console.warn to be fired');\n});\n\nQUnit.test('Testing warnings for responsiveSlides:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {responsiveSlides: true});\n    var expected = isUsingExtensionsFile(FP) ? false : true;\n\n    assert.equal(isWarnFired(), expected, 'We expect console.warn to be fired');\n});\n\nQUnit.test('Testing warnings for continuousHorizontal:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {continuousHorizontal: true});\n    var expected = isUsingExtensionsFile(FP) ? false : true;\n\n    assert.equal(isWarnFired(), expected, 'We expect console.warn to be fired');\n});\n\nQUnit.test('Testing warnings for interlockedSlides:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {interlockedSlides: true});\n    var expected = isUsingExtensionsFile(FP) ? false : true;\n\n    assert.equal(isWarnFired(), expected, 'We expect console.warn to be fired');\n});\n\nQUnit.test('Testing warnings for scrollHorizontally:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {scrollHorizontally: true});\n    var expected = isUsingExtensionsFile(FP) ? false : true;\n\n    assert.equal(isWarnFired(), expected, 'We expect console.warn to be fired');\n});\n\nQUnit.test('Testing warnings for resetSliders:true', function(assert) {\n    var id = '#fullpage';\n    warnFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {resetSliders: true});\n    var expected = isUsingExtensionsFile(FP) ? false : true;\n\n    assert.equal(isWarnFired(), expected, 'We expect console.warn to be fired');\n});\n\n\n//name element?\nQUnit.test('Testing warnings for name element same as anchor?', function(assert) {\n    var id = '#fullpage-with-name-element';\n    errorFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {anchors: ['anchor-as-name', 'test2', 'test3', 'test4'], licenseKey: licenseKey});\n    assert.equal(isErrorFired(), true, 'We expect console.warn to be fired');\n});\n\n//id element?\nQUnit.test('Testing warnings for id element same as anchor?', function(assert) {\n    var id = '#fullpage-with-name-element';\n    errorFired = false;\n    mockConsole();\n\n    var FP = initFullpageNew(id, {anchors: ['anchor-as-id', 'test2', 'test3', 'test4'], licenseKey: licenseKey});\n    assert.equal(isErrorFired(), true, 'We expect console.warn to be fired');\n});\n"
  },
  {
    "path": "tests/unit/easingcss3.js",
    "content": "QUnit.test('Testing easingCss3 value', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {easingcss3: 'ease-in-out', scrollingSpeed: 50});\n    var done = assert.async(1);\n\n    FP.moveSectionDown();\n\n    setTimeout(function(){\n        var transition = $(WRAPPER_SEL).css('transition');\n\n        assert.ok(transition.indexOf('ease-in-out') > -1, 'We expect easing effect to be applied on the css3 transition');\n        done();\n    },100);\n});\n\n"
  },
  {
    "path": "tests/unit/fitToSection.js",
    "content": "\nQUnit.test('Testing fitToSection:true', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {autoScrolling:false, fitToSection: true, scrollingSpeed: 50}));\n    var done = assert.async(2);\n    showFullpage(id);\n\n    assert.equal(document.body.scrollTop, 0, '1st section is fully visible on the viewport');\n    \n    $(id).find(SECTION_ACTIVE_SEL)[0].offsetTop = window.innerHeight * 0.6;\n    simulateScroll(window.innerHeight * 0.6, FP);\n    \n    setTimeout(function(){\n        console.warn(document.body.scrollTop);\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 1 to be active');\n        done();\n    }, 500);\n    \n\n    // setTimeout(function(){\n    //     assert.equal(document.body.scrollTop, $(id).find(SECTION_ACTIVE_SEL)[0].offsetTop, '2nd section has class COMPLETELY_SEL');\n    //     done();\n    //    showQunit(id);\n    // },500 + 1000);\n});\n\n// QUnit.test('Testing fitToSection:false', function(assert) {\n//     var id = '#fullpage';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {autoScrolling:false, fitToSection: false, scrollingSpeed: 50}));\n//     var done = assert.async(1);\n//     showFullpage(id);\n\n//     $(SECTION_ACTIVE_SEL)[0].offsetTop = window.innerHeight * 0.6;\n//     simulateScroll(window.innerHeight * 0.6);\n\n//     assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 1 to be active');\n\n//     assert.ok($(SECTION_SEL).eq(0).hasClass(COMPLETELY), '1st section has class COMPLETELY_SEL');\n\n//     setTimeout(function(){\n//         assert.ok(!$(SECTION_SEL).eq(1).hasClass(COMPLETELY), '2nd section does not have the class COMPLETELY_SEL');\n//         done();\n//         showQunit(id);\n\n//     },200 + 1000);\n// });\n\n// QUnit.test('Testing fitToSection:true & fitToSectionDelay:100', function(assert) {\n//     var id = '#fullpage';\n//     var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, {autoScrolling:false, fitToSection: true, fitToSectionDelay:100, scrollingSpeed: 50}));\n//     var done = assert.async(1);\n\n//     $(SECTION_ACTIVE_SEL)[0].offsetTop = window.innerHeight * 0.6;\n//     simulateScroll(window.innerHeight * 0.6);\n\n//     assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 1 to be active');\n\n//     assert.ok($(SECTION_SEL).eq(0).hasClass(COMPLETELY), '1st section has class COMPLETELY_SEL');\n\n//     setTimeout(function(){\n//         assert.ok($(SECTION_SEL).eq(1).hasClass(COMPLETELY), '2nd section has class COMPLETELY_SEL');\n//         done();\n//     },200 + 100);\n// });\n\n"
  },
  {
    "path": "tests/unit/fixedElements.js",
    "content": "\nQUnit.test('Testing fixedElements', function(assert) {\n    var id = '#fullpage-normalscrollelements';\n    var fixedElementSelector = '.normalscroll';\n    //we will use the element 'normalscroll' as the fixed element. Nothing to\n    //do with normal scroll :)\n    var FP = initFullpageNew(id, {fixedElements: fixedElementSelector});\n\n    assert.equal($(fixedElementSelector).closest(SECTION_SEL).length, 0, 'We expect the element to be outside a section');\n});\n"
  },
  {
    "path": "tests/unit/keyboardScrolling.js",
    "content": "\nfunction simulateMouseWheel(type){\n    var multiplier = type === 'up' ? -1 : 1;\n\n    //moving down with mouse wheel\n    var mouseWheel = new Event('wheel', { 'bubbles': true });\n    mouseWheel.deltaY = 10 * multiplier;\n    document.dispatchEvent(mouseWheel);\n}\n\nfunction simulateKeydown(type){\n    var types = { 'up': 38, 'down':40, 'right':39, 'left':37};\n    var keyCode = types[type];\n\n    //moving down with mouse wheel\n    var keydownEvent = new Event('keydown', { 'bubbles': true });\n    keydownEvent.keyCode = keyCode;\n    document.dispatchEvent(keydownEvent);\n}\n\n//not used yet\nfunction simulateTouchMove(target, type){\n    var pageY = 100, pageX = 100, differenceX = 0, differenceY = 0;\n\n    switch(type){\n        case 'down': differenceY = 500; break;\n        case 'up': differenceY = -500; break;\n        case 'left': differenceX = 500;break;\n        case 'right': differenceX = -500; break;\n    }\n\n    //touch start\n    var touchStartEvent = new Event('touchstart', { 'bubbles': true });\n    touchStartEvent.pageX = pageX + differenceX;\n    touchStartEvent.pageY = pageY + differenceY;\n    target.dispatchEvent(touchStartEvent);\n\n    //moving down with mouse wheel\n    var touchMoveEvent = new Event('touchmove', { 'bubbles': true });\n    touchMoveEvent.pageX = pageX;\n    touchMoveEvent.pageY = pageY;\n    target.dispatchEvent(touchMoveEvent);\n}\n\nfunction triggerKeydown(keyCode, shift, direction){\n    var keydownEvent = new Event('keydown', { 'bubbles': true });\n    keydownEvent.keyCode = keyCode;\n    if(shift && direction !== 'down'){\n        keydownEvent.shiftKey = 1;\n    }\n    document.dispatchEvent(keydownEvent);\n}\n\nfunction upAndDown(assert, done, FP, params, prefix){\n    var windowHeight = $(window).height();\n\n    triggerKeydown(params.down, params.shift, 'down');\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], prefix + `: We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 1, prefix + ': We expect section 2 to be active');\n        done();\n        triggerKeydown(params.up, params.shift, 'up');\n    },800);\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], prefix + `: We expect sections transformation to be [0, 0, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 0, prefix + ': We expect section 1 to be active');\n        done();\n    },800*2);\n}\n\nQUnit.test('Testing keyboardScrolling:true with keydown up & down', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {keyboardScrolling:true, loopTop:true, scrollingSpeed: 50}));\n    var windowHeight = $(window).height();\n\n    var done = assert.async(2);\n\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    simulateKeydown('down');\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n        done();\n        simulateKeydown('up');\n    },200);\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n        done();\n    },200*2);\n});\n\n\nQUnit.test('Testing keyboardScrolling:false with keydown up & down', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {keyboardScrolling:false, loopTop:true, scrollingSpeed: 50}));\n    var done = assert.async(2);\n\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    simulateKeydown('down');\n\n    setTimeout(function() {\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We don not expect section 2 to be active');\n        done();\n        simulateKeydown('up');\n    }, 200);\n\n    setTimeout(function() {\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We don not expect section 2 to be active');\n        done();\n    }, 200*2);\n});\n\nQUnit.test('Testing keyboardScrolling:true keys (tab, space, pageup, pagedown...)', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {keyboardScrolling:true, loopTop:true, scrollingSpeed: 50}));\n    var done = assert.async(2);\n\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    upAndDown(assert, done, FP, {up: 38, down: 40, shift: false}, 'Arrow up / arrow down'); //arrow up / arrow down\n});\n\nQUnit.test('Testing keyboardScrolling:true keys pageUp / pageDown', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {keyboardScrolling:true, loopTop:true, scrollingSpeed: 50}));\n    var done = assert.async(2);\n\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    upAndDown(assert, done, FP, {up: 33, down: 34, shift: false}, 'pageUp / pageDown'); //pageUp / pageDown\n});\n\nQUnit.test('Testing keyboardScrolling:true keys Spacebar', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {keyboardScrolling:true, loopTop:true, scrollingSpeed: 50}));\n    var done = assert.async(2);\n\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    upAndDown(assert, done, FP, {up: 32, down: 32, shift: true}, 'Spacebar'); //shift + spacebar / space bar\n});\n\nQUnit.test('Testing keyboardScrolling:true keys Home / end', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {keyboardScrolling:true, loopTop:true, scrollingSpeed: 50}));\n    var windowHeight = $(window).height();\n\n    var done = assert.async(2);\n\n    var params = {up: 36, down: 35, shift: false}; //home / end\n\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    triggerKeydown(params.down, params.shift, 'down');\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*3)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*3)}, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n        done();\n        triggerKeydown(params.up, params.shift, 'up');\n    },200);\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n        done();\n    },200*2);\n});\n\nQUnit.test('Testing keyboardScrolling:false with moveSectionUp & moveSectionDown', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {keyboardScrolling:false, loopTop:true, scrollingSpeed: 50}));\n    var windowHeight = $(window).height();\n\n    var done = assert.async(2);\n\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    FP.moveSectionDown();\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n        done();\n        FP.moveSectionUp();\n    },200);\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n        done();\n    },200*2);\n});\n\nQUnit.test('Testing keyboardScrolling:false with mousewheel down & up', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {keyboardScrolling:false, scrollingSpeed:600, loopTop:true}));\n    var windowHeight = $(window).height();\n\n    var done = assert.async(2);\n\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    simulateMouseWheel('down');\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n        done();\n        simulateMouseWheel('up');\n    },200);\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n        done();\n    },200*2);\n});\n\nQUnit.test('Testing setKeyboardScrolling(false)', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {keyboardScrolling:true, scrollingSpeed:600, loopTop:true}));\n    var windowHeight = $(window).height();\n\n    var done = assert.async(2);\n\n    FP.setKeyboardScrolling(false);\n\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    simulateMouseWheel('down');\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n        done();\n        simulateMouseWheel('up');\n    },200);\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n        done();\n    },200*2);\n});\n\nQUnit.test('Testing setKeyboardScrolling(true)', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {keyboardScrolling:false, scrollingSpeed:600, loopTop:true}));\n    var windowHeight = $(window).height();\n\n    var done = assert.async(2);\n\n    FP.setKeyboardScrolling(true);\n\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    simulateKeydown('down');\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n        done();\n        simulateKeydown('up');\n    },200);\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n        done();\n    },200*2);\n});\n\n\nQUnit.test('Testing setKeyboardScrolling(false, \"up\")', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {loopTop:true, scrollingSpeed: 50}));\n    var windowHeight = $(window).height();\n\n    var done = assert.async(2);\n\n    FP.setKeyboardScrolling(false, 'up');\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    simulateKeydown('down');\n\n    setTimeout(function() {\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n        done();\n        simulateKeydown('up');\n    }, 200);\n\n    //scrolling up won't do anything\n    setTimeout(function() {\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n        done();\n    }, 200*2);\n});\n\n\n\nQUnit.test('Testing setKeyboardScrolling(false, \"up, left\")', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {loopTop:true, scrollingSpeed: 50}));\n    var windowHeight = $(window).height();\n\n    var done = assert.async(4);\n\n    FP.setKeyboardScrolling(false, 'up, left');\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    simulateKeydown('down');\n\n    setTimeout(function() {\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n        done();\n        simulateKeydown('up');\n    }, 200);\n\n    //scrolling up won't do anything\n    setTimeout(function() {\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n        done();\n        FP.moveSlideRight();\n    }, 200*2);\n\n    setTimeout(function() {\n        var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n        assert.deepEqual(transforms, [`-1000`, '0', '0'], `We expect slides transformation to be [-1000, 0, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 1, 'We expect slide 2.2 to be active');\n        done();\n        simulateKeydown('left');\n    },200*3);\n\n    //sliding left won't do anything\n    setTimeout(function() {\n        var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n        assert.deepEqual(transforms, ['-1000', '0', '0'], `We expect slides transformation to be [-1000, 0, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 1, 'We expect slide 2.2 to be active');\n        done();\n    }, 200*4);\n});\n"
  },
  {
    "path": "tests/unit/lazyload.js",
    "content": "QUnit.test(\"Testing lazyLoad:true on load on 1st section with no slides \", function(assert) {\n    var id = '#fullpage';\n    appendLazyElements(id);\n    var FP = initFullpageNew(id, {lazyLoading: true});\n\n    assert.equal(areAllLazyLoaded($(SECTION_SEL).eq(0)), true, 'We expect all lazy elements to be loaded on page load');\n    assert.equal(areOthersLazyLoaded(), false, 'We expect lazy elements in other sections not to be loaded');\n});\n\nQUnit.test(\"Testing lazyLoad:true on load on 1st section with slides \", function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    appendLazyElements(id);\n\n    var FP = initFullpageNew(id, {lazyLoading: true});\n\n    assert.equal(areAllLazyLoaded($(SECTION_SEL).eq(0).find('.fp-slide.active')), true, 'We expect all lazy elements to be loaded on page load');\n    assert.equal(areOthersLazyLoaded(), false, 'We expect lazy elements in other sections not bo be loaded');\n});\n\nQUnit.test(\"Testing lazyLoad:true on load on section with middle active slide\", function(assert) {\n    var id = '#fullpage-middle-slide-active';\n    appendLazyElements(id);\n\n    var FP = initFullpageNew(id, {lazyLoading: true});\n\n    assert.equal(areAllLazyLoaded($(SECTION_SEL).eq(0).find('.fp-slide.active')), true, 'We expect all lazy elements to be loaded on page load');\n    assert.equal(areOthersLazyLoaded(), false, 'We expect lazy elements in other sections not bo be loaded');\n});\n\nQUnit.test(\"Testing lazyLoad:true on load on second section active with no slides\", function(assert) {\n    var id = '#fullpage-2nd-active-section';\n    appendLazyElements(id);\n\n    var FP = initFullpageNew(id, {lazyLoading: true});\n\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(0)), false, 'We expect no lazy elements to be loaded on 1st section');\n    assert.equal(areAllLazyLoaded($(SECTION_SEL).eq(1)), true, 'We expect all lazy elements to be loaded on 2nd section');\n    assert.equal(areOthersLazyLoaded(), false, 'We expect no lazy elements to be loaded in other sections');\n});\n\nQUnit.test(\"Testing lazyLoad:true on load on second section active with first active slide\", function(assert) {\n    var id = '#fullpage-first-slide-active-in-2nd-active-section';\n    appendLazyElements(id);\n\n    var FP = initFullpageNew(id, {lazyLoading: true});\n\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(0)), false, 'We expect no lazy elements to be loaded on 1st section');\n    assert.equal(areAllLazyLoaded($(SECTION_SEL).eq(1).find(SLIDE_SEL).eq(0)), true, 'We expect all lazy elements to be loaded on 2nd section 1st slide');\n    assert.equal(areOthersLazyLoaded(), false, 'We expect no lazy elements to be loaded in other sections / slides');\n});\n\nQUnit.test(\"Testing lazyLoad:true on load on second section active with middle active slide\", function(assert) {\n    var id = '#fullpage-middle-slide-active-in-2nd-active-section';\n    appendLazyElements(id);\n\n    var FP = initFullpageNew(id, {lazyLoading: true});\n\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(0)), false, 'We expect no lazy elements to be loaded on 1st section');\n    assert.equal(areAllLazyLoaded($(SECTION_SEL).eq(1).find(SLIDE_SEL).eq(1)), true, 'We expect all lazy elements to be loaded on 2nd section 1st slide');\n    assert.equal(areOthersLazyLoaded(), false, 'We expect no lazy elements to be loaded in other sections / slides');\n});\n\n\nQUnit.test(\"Testing lazyLoad:true on scroll to 2nd section with no slides\", function(assert) {\n    var id = '#fullpage-no-slides';\n\n    appendLazyElements(id);\n    var FP = initFullpageNew(id, {lazyLoading: true});\n\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(1)), false, 'We expect no lazy elements to be loaded on 2nd section');\n\n    FP.moveSectionDown();\n    assert.equal(areAllLazyLoaded($(SECTION_SEL).eq(1)), true, 'We expect all lazy elements to be loaded on 2nd section after movedown');\n});\n\n\nQUnit.test(\"Testing lazyLoad:true on scroll to 2nd section with first slide\", function(assert) {\n    var id = '#fullpage';\n\n    appendLazyElements(id);\n    var FP = initFullpageNew(id, {lazyLoading: true});\n\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(1)), false, 'We expect no lazy elements to be loaded');\n\n    FP.moveSectionDown();\n    assert.equal(areAllLazyLoaded($(SECTION_SEL).eq(1).find('.fp-slide.active')), true, 'We expect all lazy elements to be loaded before afterLoad');\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(1).find(SLIDE_SEL).eq(1)), false, 'We expect lazy elements in 2nd section 2nd slide not bo be loaded');\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(1).find(SLIDE_SEL).eq(2)), false, 'We expect lazy elements in 2nd section 3rd slide not bo be loaded');\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(1).find(SLIDE_SEL).eq(3)), false, 'We expect lazy elements in 2nd section 4th slide not bo be loaded');\n});\n\nQUnit.test(\"Testing lazyLoad:true on scroll to 2nd section with active middle slide\", function(assert) {\n    var id = '#fullpage-middle-slide-active-in-2nd-section';\n    appendLazyElements(id);\n\n    var FP = initFullpageNew(id, {lazyLoading: true});\n\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(1)), false, 'We expect no lazy elements to be loaded');\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(1).find(SLIDE_SEL).eq(1)), false, 'We expect no lazy elements to be loaded on 2nd section 2nd slide');\n\n    FP.moveSectionDown();\n    assert.equal(areAllLazyLoaded($(SECTION_SEL).eq(1).find(SLIDE_SEL).eq(1)), true, 'We expect all lazy elements to be loaded before afterLoad');\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(1).find(SLIDE_SEL).eq(0)), false, 'We expect lazy elements in 2nd section 1st slide not bo be loaded');\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(1).find(SLIDE_SEL).eq(2)), false, 'We expect lazy elements in 2nd section 3rd slide not bo be loaded');\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(1).find(SLIDE_SEL).eq(3)), false, 'We expect lazy elements in 2nd section 4th slide not bo be loaded');\n});\n\nQUnit.test(\"Testing lazyLoad:true on scroll to 2nd section with single slide\", function(assert) {\n    var id = '#fullpage-single-slide-in-second-section';\n    appendLazyElements(id);\n\n    var FP = initFullpageNew(id, {lazyLoading: true});\n\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(1).find(SLIDE_SEL)), false, 'We expect no lazy elements to be loaded');\n    assert.equal(isAnyLazyLoaded($(SECTION_SEL).eq(1).find(SLIDE_SEL).eq(0)), false, 'We expect no lazy elements to be loaded on 2nd section 1st slide');\n\n    FP.moveSectionDown();\n    assert.equal(areAllLazyLoaded($(SECTION_SEL).eq(1).find(SLIDE_SEL).eq(0)), true, 'We expect all lazy elements to be loaded on 2nd section 1st slide after movedown');\n});\n"
  },
  {
    "path": "tests/unit/lockAnchors.js",
    "content": "\nQUnit.test('Testing lockAnchors:true', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {lockAnchors: true}));\n\n    var done = assert.async(1);\n\n    //scrolling down won't change the anchor\n    FP.moveSectionDown();\n    assert.equal('', window.location.hash, 'Anchor link should be an empty string');\n    assert.ok($(id).find(SECTION_SEL).eq(1).hasClass(ACTIVE), 'We expect section 2 to be active');\n\n    //changing the URL won't scroll to the given section\n    window.location.hash = '#page3';\n\n    setTimeout(function() {\n        assert.ok(!$(id).find(SECTION_SEL).eq(2).hasClass(ACTIVE), 'We dont expect section 3 to be active');\n        done();\n    }, 100);\n});\n\n\nQUnit.test('Testing lockAnchors:false', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {lockAnchors: false}));\n\n    var done = assert.async(1);\n\n    //scrolling down will change the anchor\n    FP.moveSectionDown();\n    assert.equal('#page2', window.location.hash, 'Anchor link should not be an empty');\n    assert.ok($(id).find(SECTION_SEL).eq(1).hasClass(ACTIVE), 'We expect section 2 to be active');\n\n    //changing the URL will scroll to the given section\n    window.location.hash = '#page3';\n\n    setTimeout(function() {\n        console.log($(id).find(SECTION_SEL).eq(2));\n        assert.ok($(id).find(SECTION_SEL).eq(2).hasClass(ACTIVE), 'We expect section 3 to be active');\n        done();\n    }, 100);\n});\n"
  },
  {
    "path": "tests/unit/loopBottom.js",
    "content": "QUnit.test('Testing loopBottom:true', function(assert) {\n    var id = '#fullpage-last-section-active';\n    var FP = initFullpageNew(id, {loopBottom: true});\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n\n    FP.moveSectionDown();\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n});\n\nQUnit.test('Testing loopBottom:false', function(assert) {\n    var id = '#fullpage-last-section-active';\n    var FP = initFullpageNew(id, {loopBottom: false});\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n\n    FP.moveSectionDown();\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 1 to be active');\n});"
  },
  {
    "path": "tests/unit/loopTop.js",
    "content": "QUnit.test('Testing loopTop:true', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {loopTop: true});\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    FP.moveSectionUp();\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n});\n\nQUnit.test('Testing loopTop:false', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {loopTop: false});\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    FP.moveSectionUp();\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 0 to be active');\n});"
  },
  {
    "path": "tests/unit/menu.js",
    "content": "\nfunction trigger(el, eventName, data){\n    var event;\n    data = typeof data === 'undefined' ? {} : data;\n\n    // Native\n    if (window.CustomEvent) {\n        event = new CustomEvent(eventName, {detail: data});\n    }\n    else{\n        event = document.createEvent('CustomEvent');\n        event.initCustomEvent(eventName, true, true, data);\n    }\n\n    el.dispatchEvent(event);\n}\n\n\nQUnit.test('Testing menu. Moving it outside the library wrapper when css3:true', function(assert) {\n    var id = '#fullpage';\n\n    $(id).append($('#menu'));\n    assert.equal($(id).find('#menu').closest(id).length, 1, 'We expect menu to be inside the fullpage wrapper');\n\n    var FP = initFullpageNew(id, {css3: true, menu: '#menu'});\n\n    assert.equal($('#menu').length, 1, 'We expect menu to still exist');\n    assert.equal($(id).find('#menu').closest(id).length, 0, 'We expect menu to be outside the fullpage wrapper');\n});\n\nQUnit.test('Testing menu. Keeping it inside the library wrapper when css3:false', function(assert) {\n    var id = '#fullpage';\n\n    $('#menu').appendTo(id);\n    assert.equal($(id).find('#menu').closest(id).length, 1, 'We expect menu to be inside the fullpage wrapper');\n\n    var FP = initFullpageNew(id, {css3: false, menu: '#menu'});\n\n    assert.equal($('#menu').length, 1, 'We expect menu to still exist');\n    assert.equal($(id).find('#menu').closest(id).length, 1, 'We expect menu to be inside the fullpage wrapper');\n});\n\nQUnit.test('Testing menu `active` class when auto scrolling', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {menu: '.menu'}));\n\n    $('html').addClass('show');\n    debugger;\n    // first menu\n    assert.equal($('#menu').find('.active[data-menuanchor]').index(), 0, 'We expect item 1 to be active');\n    assert.equal($('#menu').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n\n    // second menu\n    assert.equal($('#menu-two').find('.active[data-menuanchor]').index(), 0, 'We expect item 1 to be active');\n    assert.equal($('#menu-two').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n\n    for(var i = 1; i<4; i++){\n        FP.moveSectionDown();\n        // first menu\n        assert.equal($('#menu').find('.active[data-menuanchor]').index(), i, 'We expect item ' + (i +1) +' to be active');\n        assert.equal($('#menu').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n        // second menu\n        assert.equal($('#menu-two').find('.active[data-menuanchor]').index(), i, 'We expect item ' + (i +1) +' to be active');\n        assert.equal($('#menu-two').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n    }\n\n    $('html').removeClass('show');\n});\n\nQUnit.test('Testing menu `active` class when auto scrolling and sliding horizontally', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {menu: '.menu'}));\n\n    // first menu\n    assert.equal($('#menu').find('.active[data-menuanchor]').index(), 0, 'We expect item 1 to be active');\n    assert.equal($('#menu').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n    // second menu\n    assert.equal($('#menu-two').find('.active[data-menuanchor]').index(), 0, 'We expect item 1 to be active');\n    assert.equal($('#menu-two').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n\n    for(var i = 1; i<4; i++){\n        FP.moveSlideRight();\n        // first menu\n        assert.equal($('#menu').find('.active[data-menuanchor]').index(), 0, 'We expect item 1 to be active');\n        assert.equal($('#menu').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n        // second menu\n        assert.equal($('#menu-two').find('.active[data-menuanchor]').index(), 0, 'We expect item 1 to be active');\n        assert.equal($('#menu-two').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n    }\n});\n\nQUnit.test('Testing menu `active` class when scrolling & autoScrolling:false', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {autoScrolling:false, menu: '.menu'}));\n    \n    // css snaps won't work unless the elements are visible\n    // so with this we make fullpage elements visible during the test\n    // and hide the jQuit stuff\n    $('html').addClass('show');\n    var done = assert.async(3);\n\n\n    setTimeout(function(){\n        // first menu\n        assert.equal($('#menu').find('.active[data-menuanchor]').index(), 0, 'We expect item 1 to be active');\n        // second menu\n        assert.equal($('#menu-two').find('.active[data-menuanchor]').index(), 0, 'We expect item 1 to be active');\n\n        done();\n        simulateScroll(window.innerHeight, FP);\n    }, 800);\n\n\n    setTimeout(function(){\n        // first menu\n        assert.equal($('#menu').find('.active[data-menuanchor]').index(), 1, 'We expect item 2 to be active');\n        assert.equal($('#menu').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n        // second menu\n        assert.equal($('#menu-two').find('.active[data-menuanchor]').index(), 1, 'We expect item 2 to be active');\n        assert.equal($('#menu-two').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n\n        done();\n        simulateScroll(window.innerHeight * 3, FP);\n    }, 800*2);\n   \n    setTimeout(function(){\n        // first menu\n        assert.equal($('#menu').find('.active[data-menuanchor]').index(), 3, 'We expect item 4 to be active');\n        assert.equal($('#menu').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n        // second menu\n        assert.equal($('#menu-two').find('.active[data-menuanchor]').index(), 3, 'We expect item 4 to be active');\n        assert.equal($('#menu-two').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n\n        done();\n        $('html').removeClass('show');\n    }, 800*3);\n    \n});\n\nQUnit.test('Testing menu `active` class when hash change by anchor name', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {menu: '.menu'}));\n\n    var done = assert.async(1);\n\n    // first menu\n    assert.equal($('#menu').find('.active[data-menuanchor]').index(), 0, 'We expect item 1 to be active');\n    assert.equal($('#menu').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n    // second menu\n    assert.equal($('#menu-two').find('.active[data-menuanchor]').index(), 0, 'We expect item 1 to be active');\n    assert.equal($('#menu-two').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n\n    //changing the URL won't scroll to the given section\n    window.location.hash = '#page3';\n\n    setTimeout(function(){\n        // first menu\n        assert.equal($('#menu').find('.active[data-menuanchor]').index(), 2, 'We expect item 3 to be active');\n        assert.equal($('#menu').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n        // second menu\n        assert.equal($('#menu-two').find('.active[data-menuanchor]').index(), 2, 'We expect item 3 to be active');\n        assert.equal($('#menu-two').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n        done();\n    },100);\n});\n\nQUnit.test('Testing menu `active` class when hash change by section index', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {menu: '.menu'}));\n\n    var done = assert.async(1);\n\n    // first menu\n    assert.equal($('#menu').find('.active[data-menuanchor]').index(), 0, 'We expect item 1 to be active');\n    assert.equal($('#menu').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n    // second menu\n    assert.equal($('#menu-two').find('.active[data-menuanchor]').index(), 0, 'We expect item 1 to be active');\n    assert.equal($('#menu-two').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n\n    //changing the URL won't scroll to the given section\n    window.location.hash = '#3';\n\n    setTimeout(function(){\n        // first menu\n        assert.equal($('#menu').find('.active[data-menuanchor]').index(), 2, 'We expect item 3 to be active');\n        assert.equal($('#menu').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n        // second menu\n        assert.equal($('#menu-two').find('.active[data-menuanchor]').index(), 2, 'We expect item 3 to be active');\n        assert.equal($('#menu-two').find('.active[data-menuanchor]').length, 1, 'We expect a single item to be active');\n        done();\n    },100);\n});\n"
  },
  {
    "path": "tests/unit/moveSectionDown.js",
    "content": "QUnit.test('Testing moveSectionDown first section active with slides {css3:true, autoScrolling:true}', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {css3: true, autoScrolling: true});\n    var windowHeight = $(window).height();\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], 'We expect sections transformation to be [0, 0, 0]');\n\n    FP.moveSectionDown();\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n    FP.moveSectionDown();\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*2)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*2)}, 0]`);\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 2, 'We expect section 3 to be active');\n    FP.moveSectionDown();\n});\n\n\nQUnit.test('Testing moveSectionDown first section active with slides {css3:false, autoScrolling:true}', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {css3: false, autoScrolling: true});\n    var windowHeight = $(window).height();\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(FP.test.top, '0px', 'We expect wrapper top property to be 0px');\n\n    FP.moveSectionDown();\n    assert.deepEqual(FP.test.top, -(windowHeight*1) +'px', `We expect wrapper top property to be -${(windowHeight*1)}px`);\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n    FP.moveSectionDown();\n\n    assert.deepEqual(FP.test.top, -(windowHeight*2) +'px', `We expect wrapper top property to be -${(windowHeight*2)}px`);\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 2, 'We expect section 3 to be active');\n});\n\n\n\nQUnit.test('Testing moveSectionDown in fullpage-last-section-active {css3:true, autoScrolling:true}', function(assert) {\n    var id = '#fullpage-last-section-active';\n    var FP = initFullpageNew(id, {css3: true, autoScrolling: true});\n    var windowHeight = $(window).height();\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*3)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*3)}, 0]`);\n\n    FP.moveSectionDown();\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*3)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*3)}, 0]`);\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n});\n\n\nQUnit.test('Testing moveSectionDown in fullpage-last-section-active {css3:false, autoScrolling:true}', function(assert) {\n    var id = '#fullpage-last-section-active';\n    var FP = initFullpageNew(id, {css3: false, animateAnchor: false,autoScrolling: true});\n    var windowHeight = $(window).height();\n\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n    assert.deepEqual(FP.test.top,  -(windowHeight*3) +'px', `We expect wrapper top property to be -${(windowHeight*3)}px`);\n\n    FP.moveSectionDown();\n    assert.deepEqual(FP.test.top,  -(windowHeight*3) +'px', `We expect wrapper top property to be -${(windowHeight*3)}px`);\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n});\n\n\n\n/* Not working! qunit doesn't allow the use of something like $('html,body').animate({scrollTop: 400})\nQUnit.test('Testing moveSectionDown in fullpage-last-section-active {autoScrolling:false}', function(assert) {\n    var id = '#fullpage-last-section-active';\n    var FP = initFullpageNew(id, {autoScrolling: false, animateAnchor: false});\n    var windowHeight = $(window).height();\n\n    var done = assert.async(1);\n\n    $('html,body').scrollTop(400);\n\n    console.log( $(window).scrollTop() );\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n    assert.deepEqual(getWindowPosition(), 0, 'We expect window position to be 0');\n\n    FP.moveSectionDown();\n    setTimeout(function(){\n\n        assert.deepEqual(getWindowPosition(), 0, 'We expect window position to be 0');\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n        done();\n    }, 800);\n});\n\n/* Not working! qunit doesn't allow the use of something like $('html,body').animate({scrollTop: 400}) */\n/*\nQUnit.test('Testing moveSectionDown first section active with slides {autoScrolling:false}', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {autoScrolling: false});\n\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getWindowPosition(), 0, 'We expect window position to be 0');\n\n    FP.moveSectionDown();\n    setTimeout(function(){\n        assert.deepEqual(getWindowPosition(), 0, 'We expect window position to be 0');\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n        done();\n    }, 800);\n});\n*/\n"
  },
  {
    "path": "tests/unit/moveSectionUp.js",
    "content": "QUnit.test('Testing moveSectionUp first section active with slides {css3:true, autoScrolling:true}', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {css3: true, autoScrolling: true});\n    var windowHeight = $(window).height();\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], 'We expect sections transformation to be [0, 0, 0]');\n\n    FP.moveSectionUp();\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], 'We expect sections transformation to be [0, 0, 0]');\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n});\n\n\nQUnit.test('Testing moveSectionUp first section active with slides {css3:false, autoScrolling:true}', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {css3: false, autoScrolling: true});\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(FP.test.top, '0px', 'We expect wrapper top property to be 0px');\n\n    FP.moveSectionUp();\n    assert.deepEqual(FP.test.top, '0px', 'We expect wrapper top property to be 0px');\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n});\n\n\n\n/* Not working! qunit doesn't allow the use of something like $('html,body').animate({scrollTop: 400}) */\n/*\nQUnit.test('Testing moveSectionUp first section active with slides {autoScrolling:false}', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {autoScrolling: false});\n\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getWindowPosition(), 0, 'We expect window position to be 0');\n\n    FP.moveSectionUp();\n    setTimeout(function(){\n        assert.deepEqual(getWindowPosition(), 0, 'We expect window position to be 0');\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n        done();\n    }, 800);\n});\n*/\n\n\nQUnit.test('Testing moveSectionUp in fullpage-last-section-active {css3:true, autoScrolling:true}', function(assert) {\n    var id = '#fullpage-last-section-active';\n    var FP = initFullpageNew(id, {css3: true, autoScrolling: true});\n    var windowHeight = $(window).height();\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*3)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*3)}, 0]`);\n\n    FP.moveSectionUp();\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*2)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*2)}, 0]`);\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 2, 'We expect section 3 to be active');\n    FP.moveSectionUp();\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n    FP.moveSectionUp();\n});\n\n\n\nQUnit.test('Testing moveSectionUp in fullpage-last-section-active {css3:false, autoScrolling:true}', function(assert) {\n    var id = '#fullpage-last-section-active';\n    var FP = initFullpageNew(id, {css3: false, animateAnchor: false,autoScrolling: true});\n    var windowHeight = $(window).height();\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n    assert.deepEqual(FP.test.top,  -(windowHeight*3) +'px', `We expect wrapper top property to be -${(windowHeight*3)}px`);\n\n    FP.moveSectionUp();\n    assert.deepEqual(FP.test.top,  -(windowHeight*2) +'px', `We expect wrapper top property to be -${(windowHeight*2)}px`);\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 2, 'We expect section 3 to be active');\n    FP.moveSectionUp();\n\n    assert.deepEqual(FP.test.top,  -(windowHeight*1) +'px', `We expect wrapper top property to be -${(windowHeight*1)}px`);\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n});\n\n\n\n/* Not working! qunit doesn't allow the use of something like $('html,body').animate({scrollTop: 400})\nQUnit.test('Testing moveSectionUp in fullpage-last-section-active {autoScrolling:false}', function(assert) {\n    var id = '#fullpage-last-section-active';\n    var FP = initFullpageNew(id, {autoScrolling: false, animateAnchor: false});\n    var windowHeight = $(window).height();\n\n    var done = assert.async(1);\n\n    $('html,body').scrollTop(400);\n\n    console.log( $(window).scrollTop() );\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 3, 'We expect section 4 to be active');\n    assert.deepEqual(getWindowPosition(), 0, 'We expect window position to be 0');\n\n    FP.moveSectionUp();\n    setTimeout(function(){\n\n        assert.deepEqual(getWindowPosition(), 0, 'We expect window position to be 0');\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n        done();\n    }, 800);\n});\n*/\n"
  },
  {
    "path": "tests/unit/moveSlideLeft.js",
    "content": "QUnit.test('Testing moveSlideLeft css3:true', function(assert) {\n    var id = '#fullpage-moveSlideLeft';\n    var FP = initFullpageNew(id, slidesCallbacks);\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 3, 'We expect slide 2.4 to be active');\n\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['-3000', '0', '0'], 'We expect slides tranformation to be [-3000, 0, 0]');\n\n    FP.moveSlideLeft();\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['-2000', '0', '0'], 'We expect slides tranformation to be [-2000, 0, 0]');\n\n    FP.moveSlideLeft();\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['-1000', '0', '0'], 'We expect slides tranformation to be [-1000, 0, 0]');\n\n});\n\n\nQUnit.test('Testing moveSlideLeft css3:false', function(assert) {\n    var id = '#fullpage-moveSlideLeft';\n    var FP = initFullpageNew(id, Object.assign({}, slidesCallbacks, {css3: false}));\n\n    function getPosition(){\n        return FP.test.left[$(id).find(SECTION_ACTIVE_SEL).index()];\n    }\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 3, 'We expect slide 2.4 to be active');\n    assert.deepEqual(getPosition(), 3000, 'We expect slides position to be 3');\n\n    FP.moveSlideLeft();\n    assert.deepEqual(getPosition(), 2000, 'We expect slides tranformation to be 2000');\n    FP.moveSlideLeft();\n\n    assert.deepEqual(getPosition(), 1000, 'We expect slides tranformation to be 1000');\n});\n\nQUnit.test('Testing moveSlideLeft single-slide', function(assert) {\n    var id = '#fullpage-single-slide';\n    var FP = initFullpageNew(id, slidesCallbacks);\n\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['0', '0', '0'], 'We expect slides tranformation to be [0, 0, 0]');\n\n    FP.moveSlideLeft();\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['0', '0', '0'], 'We expect slides tranformation to be [0, 0, 0]');\n});\n\nQUnit.test('Testing moveSlideLeft loopHorizontal:true first-slide-active', function(assert) {\n    var id = '#fullpage-first-slide-active';\n    var options =  Object.assign({}, slidesCallbacks, {loopHorizontal: true });\n    var FP = initFullpageNew(id, options);\n\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['0', '0', '0'], 'We expect slides tranformation to be [0, 0, 0]');\n\n    FP.moveSlideLeft();\n\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['-1000', '0', '0'], 'We expect slides tranformation to be [-1000, 0, 0]');\n});\n\nQUnit.test('Testing moveSlideLeft loopHorizontal:false first-slide-active', function(assert) {\n    var id = '#fullpage-first-slide-active';\n    var options =   Object.assign({}, slidesCallbacks, {loopHorizontal: false });\n    var FP = initFullpageNew(id, options);\n\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['0', '0', '0'], 'We expect slides tranformation to be [0, 0, 0]');\n\n    FP.moveSlideLeft();\n\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['0', '0', '0'], 'We expect slides tranformation to be [0, 0, 0]');\n});\n"
  },
  {
    "path": "tests/unit/moveSlideRight.js",
    "content": "QUnit.test('Testing moveSlideRight css3:true', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, slidesCallbacks);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 0, 'We expect slide 2.1 to be active');\n\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['0', '0', '0'], 'We expect slides tranformation to be [0, 0, 0]');\n\n    FP.moveSlideRight();\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['-1000', '0', '0'], 'We expect slides tranformation to be [-1000, 0, 0]');\n    FP.moveSlideRight();\n\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['-2000', '0', '0'], 'We expect slides tranformation to be [-2000, 0, 0]');\n});\n\nQUnit.test('Testing moveSlideRight css3:false', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, slidesCallbacks, {css3: false}));\n\n    function getPosition(){\n        return FP.test.left[$(id).find(SECTION_ACTIVE_SEL).index()];\n    }\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).find(SLIDES_WRAPPER_SEL).index(), 0, 'We expect slide 2.1 to be active');\n    assert.deepEqual(getPosition(), 0, 'We expect slides position to be 0');\n\n    FP.moveSlideRight();\n    assert.deepEqual(getPosition(), 1000, 'We expect slides tranformation to be 1000');\n    FP.moveSlideRight();\n\n    assert.deepEqual(getPosition(), 2000, 'We expect slides tranformation to be 2000');\n});\n\nQUnit.test('Testing moveSlideRight single-slide', function(assert) {\n    var id = '#fullpage-single-slide';\n    var FP = initFullpageNew(id, slidesCallbacks);\n\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['0', '0', '0'], 'We expect slides tranformation to be [0, 0, 0]');\n\n    FP.moveSlideRight();\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['0', '0', '0'], 'We expect slides tranformation to be [0, 0, 0]');\n    FP.moveSlideRight();\n});\n\nQUnit.test('Testing moveSlideRight loopHorizontal:true second-slide-active', function(assert) {\n    var id = '#fullpage-second-slide-active';\n    var options =   Object.assign({}, slidesCallbacks, {loopHorizontal: true });\n    var FP = initFullpageNew(id, options);\n\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['-1000', '0', '0'], 'We expect slides tranformation to be [-1000, 0, 0]');\n\n    FP.moveSlideRight();\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['0', '0', '0'], 'We expect slides tranformation to be [0, 0, 0]');\n    FP.moveSlideRight();\n});\n\nQUnit.test('Testing moveSlideRight loopHorizontal:false second-slide-active', function(assert) {\n    var id = '#fullpage-second-slide-active';\n    var options =   Object.assign({}, slidesCallbacks, {loopHorizontal: false });\n    var FP = initFullpageNew(id, options);\n\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['-1000', '0', '0'], 'We expect slides tranformation to be [-1000, 0, 0]');\n\n    FP.moveSlideRight();\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['-1000', '0', '0'], 'We expect slides tranformation to be [-1000, 0, 0]');\n    FP.moveSlideRight();\n});\n\n"
  },
  {
    "path": "tests/unit/moveTo.js",
    "content": "QUnit.test('Testing moveTo vertical with anchor', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, allBasicOptions);\n    var windowHeight = $(window).height();\n\n    FP.moveTo('page3');\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 2, 'We expect section 3 to be active');\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*2)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*2)}, 0]`);\n});\n\nQUnit.test('Testing moveTo vertical with index', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, allBasicOptions);\n    var windowHeight = $(window).height();\n\n    FP.moveTo('2');\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n});\n\nQUnit.test('Testing moveTo verticall + horizontal with anchors', function(assert) {\n    var id = '#fullpage-slides-with-anchor';\n    var FP = initFullpageNew(id, allBasicOptions);\n    var windowHeight = $(window).height();\n    var done = assert.async(1);\n\n    //moving to a specific slide within a section\n    FP.moveTo('page2', 'slide3');\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n\n    setTimeout(function(){\n        assert.equal($(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 2, 'We expect slide 2.3 to be active');\n        var slidesTranforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n        assert.deepEqual(slidesTranforms, ['-2000', '0', '0'], 'We expect slides tranformation to be [-2000, 0, 0]');\n        done();\n    }, 800);\n});\n\nQUnit.test('Testing moveTo verticall + horizontal with index', function(assert) {\n    var id = '#fullpage-slides-with-anchor';\n    var FP = initFullpageNew(id, allBasicOptions);\n    var windowHeight = $(window).height();\n    var done = assert.async(1);\n\n    //moving to a specific slide within a section\n    FP.moveTo('2', '2');\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n\n    setTimeout(function(){\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 2, 'We expect slide 2.3 to be active');\n        var slidesTranforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n        assert.deepEqual(slidesTranforms, ['-2000', '0', '0'], 'We expect slides tranformation to be [-2000, 0, 0]');\n        done();\n    }, 800);\n});\n\nQUnit.test('Testing moveTo horizontal only with anchor', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, allBasicOptions);\n    var windowHeight = $(window).height();\n\n    //moving to a specific slide within a section\n    FP.moveTo('1', 'slide3');\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 2, 'We expect slide 1.3 to be active');\n    var slidesTranforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(slidesTranforms, ['-2000', '0', '0'], 'We expect slides tranformation to be [-2000, 0, 0]');\n});\n\nQUnit.test('Testing moveTo horizontal only with index', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, allBasicOptions);\n    var windowHeight = $(window).height();\n\n    //moving to a specific slide within a section\n    FP.moveTo('1', '2');\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 2, 'We expect slide 1.3 to be active');\n    var slidesTranforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(slidesTranforms, ['-2000', '0', '0'], 'We expect slides tranformation to be [-2000, 0, 0]');\n});"
  },
  {
    "path": "tests/unit/nav.js",
    "content": "QUnit.test('Testing navigation exist when using navigation:true', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {navigation: true}));\n\n    assert.equal($(SECTION_NAV_SEL).length, 1, 'We expect navigation to exist');\n    assert.equal($(SECTION_NAV_SEL).closest(id).length, 0, 'We expect navigation to be outside the fullpage wrapper');\n    assert.equal($(SECTION_NAV_SEL).find('li').length, $(id).find(SECTION_SEL).length, 'We expect navigation have as many items as sections exist');\n    assert.equal($(SECTION_NAV_SEL).find('a').length, $(id).find(SECTION_SEL).length, 'We expect navigation have as many links as sections exist');\n    assert.equal($(SECTION_NAV_SEL).find('span').length, $(id).find(SECTION_SEL).length * 2, 'We expect navigation have as many spans as sections exist');\n});\n\nQUnit.test('Testing navigation does not exist when using navigation:false', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {navigation: false}));\n\n    assert.equal($(SECTION_NAV_SEL).length, 0, 'We expect no navigation to exist');\n});\n\nQUnit.test('Testing navigation `active` class when auto scrolling', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {navigation: true}));\n\n    assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 0, 'We expect item 1 to be active');\n    assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n\n    for(var i = 1; i<4; i++){\n        FP.moveSectionDown();\n        assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), i, 'We expect item ' + (i +1) +' to be active');\n        assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n    }\n});\n\nQUnit.test('Testing navigation `active` class when auto scrolling and sliding horizontally', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {navigation: true}));\n\n    assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 0, 'We expect item 1 to be active');\n    assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n\n    for(var i = 1; i<4; i++){\n        FP.moveSlideRight();\n        assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 0, 'We expect item 1 to be active');\n        assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n    }\n});\n\nQUnit.test('Testing navigation `active` class when scrolling & autoScrolling:false', function(assert) {\n    var id = '#fullpage';\n\n    // css snaps won't work unless the elements are visible\n    // so with this we make fullpage elements visible during the test\n    // and hide the jQuit stuff\n    $('html').addClass('show');\n\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {autoScrolling:false, navigation: true}));\n    var done = assert.async(2);\n    assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 0, 'We expect item 1 to be active');\n\n    //simulating scroll event\n    simulateScroll(window.innerHeight, FP);\n\n   \n    setTimeout(function(){\n        assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 1, 'We expect item 2 to be active');\n        assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');  \n        done();\n        simulateScroll(window.innerHeight * 3, FP);\n    }, 800);\n\n\n    setTimeout(function(){\n        assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 3, 'We expect item 4 to be active');\n        assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n\n        done();\n        $('html').removeClass('show');\n    }, 800*2);\n});\n\nQUnit.test('Testing navigation `active` class when hash change by anchor name', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {navigation: true}));\n\n    var done = assert.async(1);\n\n    assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 0, 'We expect item 1 to be active');\n    assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n\n    window.location.hash = '#page3';\n\n    setTimeout(function(){\n        assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 2, 'We expect item 3 to be active');\n        assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n        done();\n    },100);\n});\n\nQUnit.test('Testing navigation `active` class when hash change by section index', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {navigation: true}));\n\n    var done = assert.async(1);\n\n    assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 0, 'We expect item 1 to be active');\n    assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n\n    window.location.hash = '#3';\n\n    setTimeout(function(){\n        assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 2, 'We expect item 3 to be active');\n        assert.equal($(SECTION_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n        done();\n    },100);\n});\n\nQUnit.test('Testing navigationPosition:right', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {navigation: true, navigationPosition:'right'}));\n\n    assert.ok($(SECTION_NAV_SEL).hasClass('fp-right'), 'We expect nav to have class right');\n});\n\nQUnit.test('Testing navigationPosition:left', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {navigation: true, navigationPosition:'left'}));\n\n    assert.ok($(SECTION_NAV_SEL).hasClass('fp-left'), 'We expect nav to have class right');\n});\n\nQUnit.test('Testing navigationTooltips option', function(assert) {\n    var id = '#fullpage';\n    var tooltips = ['demo1', 'demo2', 'demo3', 'demo4'];\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {navigation: true, navigationTooltips: tooltips}));\n    for(var i = 0; i<tooltips.length; i++){\n        assert.equal($(SECTION_NAV_SEL).find(SECTION_NAV_TOOLTIP_SEL).eq(i).text(), tooltips[i], `We expect nav tooltip number ${i} to be ${tooltips[i]}`);\n    }\n});\n\nQUnit.test('Testing navigationTooltips from data-anchor', function(assert) {\n    var id = '#fullpage-nav-tooltips';\n    var tooltips = ['demo1', 'demo2', 'demo3', 'demo4'];\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {navigation: true}));\n    for(var i = 0; i<tooltips.length; i++){\n        assert.equal($(SECTION_NAV_SEL).find(SECTION_NAV_TOOLTIP_SEL).eq(i).text(), tooltips[i], `We expect nav tooltip number ${i} to be ${tooltips[i]}`);\n    }\n});\n\nQUnit.test('Testing showActiveTooltip:true', function(assert) {\n    var id = '#fullpage';\n    var tooltips = ['demo1', 'demo2', 'demo3', 'demo4'];\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {navigation: true, navigationTooltips: tooltips, showActiveTooltip:true}));\n    var done = assert.async(1);\n\n    setTimeout(function(){\n        assert.equal($(SECTION_NAV_SEL).find(SECTION_NAV_TOOLTIP_SEL).first().css('opacity'), '1', 'We expect the 1st tooltip to be visible');\n        done();\n    },300);\n});\n\nQUnit.test('Testing showActiveTooltip:false', function(assert) {\n    var id = '#fullpage';\n    var tooltips = ['demo1', 'demo2', 'demo3', 'demo4'];\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {navigation: true, navigationTooltips: tooltips, showActiveTooltip:false}));\n    var done = assert.async(1);\n\n    setTimeout(function(){\n        assert.equal($(SECTION_NAV_SEL).find(SECTION_NAV_TOOLTIP_SEL).first().css('opacity'), '0', 'We expect the 1st tooltip to be visible');\n        done();\n    },300);\n});\n\nQUnit.test('Testing click on navigation bullets span with anchors', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {navigation: true}));\n    var windowHeight = $(window).height();\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], 'We expect sections transformation to be [0, 0, 0]');\n\n    $(SECTION_NAV_SEL).find('li').eq(1).find('span')[0].click();\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n        done();\n    }, 30);\n});\n\nQUnit.test('Testing click on navigation bullets a href with anchors', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {navigation: true}));\n    var windowHeight = $(window).height();\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], 'We expect sections transformation to be [0, 0, 0]');\n\n    $(SECTION_NAV_SEL).find('li').eq(1).find('a')[0].click();\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n        done();\n    }, 30);\n});\n\nQUnit.test('Testing click on navigation bullets span with no anchors', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {navigation: true});\n    var windowHeight = $(window).height();\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], 'We expect sections transformation to be [0, 0, 0]');\n\n    $(SECTION_NAV_SEL).find('li').eq(1).find('span')[0].click();\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n        done();\n    }, 30);\n});\n\nQUnit.test('Testing click on navigation bullets a href with no anchors', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {navigation: true});\n    var windowHeight = $(window).height();\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], 'We expect sections transformation to be [0, 0, 0]');\n\n    $(SECTION_NAV_SEL).find('li').eq(1).find('a')[0].click();\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n        done();\n    }, 30);\n});\n"
  },
  {
    "path": "tests/unit/normalScrollElements.js",
    "content": "QUnit.test('Testing normalScrollElements disabled', function(assert) {\n    var id = '#fullpage-normalscrollelements';\n    var FP = initFullpageNew(id, {autoScrolling:true});\n    var windowHeight = $(window).height();\n\n    trigger($('.normalscroll')[0], 'mouseenter');\n    simulateMouseWheel('down');\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n});\n\n\nQUnit.test('Testing normalScrollElements: \".normalScroll\" - scrolling inside it', function(assert) {\n    var id = '#fullpage-normalscrollelements';\n    var FP = initFullpageNew(id, {autoScrolling:true, normalScrollElements: '.normalscroll'});\n\n    trigger($('.normalscroll')[0], 'mouseenter');\n    simulateMouseWheel('down');\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n});\n\nQUnit.test('Testing normalScrollElements: \".normalScroll\" - scrolling outside it', function(assert) {\n    var id = '#fullpage-normalscrollelements';\n    var FP = initFullpageNew(id, {autoScrolling:true, normalScrollElements: '.normalscroll'});\n    var windowHeight = $(window).height();\n\n    trigger($(SECTION_ACTIVE_SEL).find('.title')[0], 'mouseenter');\n    simulateMouseWheel('down');\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n});\n\n\nQUnit.test('Testing normalScrollElements on dynamically added elements - scrolling inside it', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {autoScrolling:true, normalScrollElements: '.normalscroll'});\n\n    //adding the element dynamically\n    var element = `\n        <div class=\"normalscroll\">\n            <h1>Test</h1><h1>Test</h1><h1>Test</h1><h1>Test</h1>\n            <h1>Test</h1><h1>Test</h1><h1>Test</h1><h1>Test</h1>\n            <h1>Test</h1><h1>Test</h1><h1>Test</h1><h1>Test</h1>\n            <h1>Test</h1><h1>Test</h1><h1>Test</h1><h1>Test</h1>\n        </div>\n    `;\n    $(SECTION_ACTIVE_SEL).append(element);\n\n\n    trigger($('.normalscroll')[0], 'mouseenter');\n    simulateMouseWheel('down');\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n});\n\n\n\nQUnit.test('Testing normalScrollElements on dynamically added element - scrolling outside it', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {autoScrolling:true, normalScrollElements: '.normalscroll'});\n    var windowHeight = $(window).height();\n\n    //adding the element dynamically\n    var element = `\n        <div class=\"normalscroll\">\n            <h1>Test</h1><h1>Test</h1><h1>Test</h1><h1>Test</h1>\n            <h1>Test</h1><h1>Test</h1><h1>Test</h1><h1>Test</h1>\n            <h1>Test</h1><h1>Test</h1><h1>Test</h1><h1>Test</h1>\n            <h1>Test</h1><h1>Test</h1><h1>Test</h1><h1>Test</h1>\n        </div>\n    `;\n    $(SECTION_ACTIVE_SEL).append(element);\n\n    //entering with the mouse\n    trigger($('.normalscroll')[0], 'mouseenter');\n\n    //leaving with the mouse\n    trigger($('.normalscroll')[0], 'mouseleave');\n\n    simulateMouseWheel('down');\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n});"
  },
  {
    "path": "tests/unit/paddings.js",
    "content": "\nQUnit.test('Testing paddingTop', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var padding = 10;\n    var FP = initFullpageNew(id, {paddingTop: padding + 'px'});\n    var windowHeight = $(window).height();\n\n\n    for(var i = 0; i < $(SECTION_SEL).length; i++){\n        assert.equal($(SECTION_SEL)[i].style.paddingTop, padding+'px', `We expect sections to have ${padding}px of paddingTop`);\n        assert.equal($(SECTION_SEL).eq(i).height(), windowHeight - padding, `We expect sections to have ${windowHeight - padding}px height.`);\n    }\n\n    //no padding for slides\n    for(var i = 0; i < $(SLIDE_SEL).length; i++){\n        assert.equal($(SLIDE_SEL)[i].style.paddingTop, '', 'We expect slides to not have any backgroundColor');\n    }\n});\n\nQUnit.test('Testing paddingBottom', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var padding = 10;\n    var FP = initFullpageNew(id, {paddingBottom: padding + 'px'});\n    var windowHeight = $(window).height();\n\n\n    for(var i = 0; i < $(SECTION_SEL).length; i++){\n        assert.equal($(SECTION_SEL)[i].style.paddingBottom, padding+'px', `We expect sections to have ${padding}px of paddingBottom`);\n        assert.equal($(SECTION_SEL).eq(i).height(), windowHeight - padding, `We expect sections to have ${windowHeight - padding}px height.`);\n    }\n\n    //no padding for slides\n    for(var i = 0; i < $(SLIDE_SEL).length; i++){\n        assert.equal($(SLIDE_SEL)[i].style.paddingTop, '', 'We expect slides to not have any backgroundColor');\n    }\n});\n\n"
  },
  {
    "path": "tests/unit/recordHistory.js",
    "content": "//mockup (apparently location.replace is read only so.... NO TESTS...)\n\n/*\nwindow.location.replace = function(url){\n    console.log(\"weeee\");\n    locationReplace = url;\n};\n\n\nQUnit.test('Testing recordHistory:false', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {recordHistory: false}));\n    var windowHeight = $(window).height();\n\n    FP.moveSectionDown();\n    assert.equal(locationReplace, '#page2', 'We expect section 3 to be active');\n});\n*/"
  },
  {
    "path": "tests/unit/responsiveHeight.js",
    "content": "function checkIsResponsive(FP, assert){\n    assert.ok($('body').hasClass(RESPONSIVE), 'We expect RESPONSIVE class to be applied on the body');\n    assert.equal(FP.test.options.autoScrolling, false, 'We expect autoScrolling to be false');\n    assert.equal(FP.test.options.fitToSection, false, 'We expect fitToSection to be false');\n    assert.equal($(SECTION_NAV_SEL).is(':visible'), false, 'We expect SECTION_NAV_SEL to be hidden');\n    assert.equal(afterResponsive, true, 'We expect afterResponsive callback to be fired');\n}\n\nfunction checkIsNotResponsive(FP, assert){\n    assert.ok(!$('body').hasClass(RESPONSIVE), 'We expect RESPONSIVE class to not be applied on the body');\n    assert.equal(FP.test.options.autoScrolling, true, 'We expect autoScrolling to be true');\n    assert.equal(FP.test.options.fitToSection, true, 'We expect fitToSection to be true');\n    assert.equal($(SECTION_NAV_SEL).is(':visible'), true, 'We expect SECTION_NAV_SEL to be visible');\n    assert.equal(afterResponsive, false, 'We expect afterResponsive callback not to have been fired yet or to have value false');\n}\n\nQUnit.test('Testing responsiveHeight', function(assert) {\n    var id = '#fullpage';\n    var done = assert.async(1);\n    var windowHeight = $(window).height();\n    var reponsiveValue = windowHeight/1.5;\n    var options = {responsiveHeight: reponsiveValue, fitToSection:true, navigation:true};\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, options));\n\n    checkIsNotResponsive(FP, assert);\n\n    //mocking resize down\n    window.innerHeight = reponsiveValue - 1;\n    trigger(window, 'resize');\n\n    setTimeout(function(){\n        checkIsResponsive(FP, assert);\n        done();\n    }, 800);\n});\n\nQUnit.test('Testing responsiveHeight on page load', function(assert) {\n    var id = '#fullpage';\n    var windowHeight = $(window).height();\n    var reponsiveValue = windowHeight + 100;\n    var options = {responsiveHeight: reponsiveValue, fitToSection:true, navigation:true};\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, options));\n\n    checkIsResponsive(FP, assert);\n});\n\nQUnit.test('Testing responsiveHeight undo responsive on resize up', function(assert) {\n    var id = '#fullpage';\n    var done = assert.async(1);\n    var windowHeight = $(window).height();\n    var reponsiveValue = windowHeight + 100;\n    var options = {responsiveHeight: reponsiveValue, fitToSection:true, navigation:true};\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, options));\n\n    checkIsResponsive(FP, assert);\n\n    //mocking resize down\n    window.innerHeight = windowHeight + 200;\n    trigger(window, 'resize');\n\n    setTimeout(function(){\n        checkIsNotResponsive(FP, assert);\n        done();\n    }, 1900);\n});"
  },
  {
    "path": "tests/unit/responsiveWidth.js",
    "content": "function checkIsResponsive(FP, assert){\n    assert.ok($('body').hasClass(RESPONSIVE), 'We expect RESPONSIVE class to be applied on the body');\n    assert.equal(FP.test.options.autoScrolling, false, 'We expect autoScrolling to be false');\n    assert.equal(FP.test.options.fitToSection, false, 'We expect fitToSection to be false');\n    assert.equal($(SECTION_NAV_SEL).is(':visible'), false, 'We expect SECTION_NAV_SEL to be hidden');\n    assert.equal(afterResponsive, true, 'We expect afterResponsive callback to be fired');\n}\n\nfunction checkIsNotResponsive(FP, assert){\n    assert.ok(!$('body').hasClass(RESPONSIVE), 'We expect RESPONSIVE class to not be applied on the body');\n    assert.equal(FP.test.options.autoScrolling, true, 'We expect autoScrolling to be true');\n    assert.equal(FP.test.options.fitToSection, true, 'We expect fitToSection to be true');\n    assert.equal($(SECTION_NAV_SEL).is(':visible'), true, 'We expect SECTION_NAV_SEL to be visible');\n    assert.equal(afterResponsive, false, 'We expect afterResponsive callback not to have been fired yet or to have value false');\n}\n\nQUnit.test('Testing responsiveWidth', function(assert) {\n    var id = '#fullpage';\n    var done = assert.async(2);\n    var windowWidth = $(window).width();\n    var reponsiveValue = windowWidth/1.5;\n    var options = {responsiveWidth: reponsiveValue, fitToSection:true, navigation:true};\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, options));\n\n    setTimeout(function(){\n        checkIsNotResponsive(FP, assert);\n        done();\n\n        //mocking resize down\n        window.innerWidth = reponsiveValue - 1;\n        trigger(window, 'resize');\n    }, 800);\n\n    setTimeout(function(){\n        checkIsResponsive(FP, assert);\n        done();\n    }, 800 * 2);\n});\n\nQUnit.test('Testing responsiveWidth on page load', function(assert) {\n    var id = '#fullpage';\n    var windowWidth = $(window).width();\n    var reponsiveValue = windowWidth + 100;\n    var options = {responsiveWidth: reponsiveValue, fitToSection:true, navigation:true};\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, options));\n\n    checkIsResponsive(FP, assert);\n});\n\nQUnit.test('Testing responsiveWidth undo responsive on resize up', function(assert) {\n    var id = '#fullpage';\n    var done = assert.async(1);\n    var windowWidth = $(window).width();\n    var reponsiveValue = windowWidth + 100;\n    var options = {responsiveWidth: reponsiveValue, fitToSection:true, navigation:true};\n    var FP = initFullpageNew(id, Object.assign({}, sectionsAndSlidesCallbacks, options));\n\n    checkIsResponsive(FP, assert);\n\n    //mocking resize down\n    window.innerWidth = windowWidth + 200;\n    trigger(window, 'resize');\n\n    setTimeout(function(){\n        console.log(\"timeout....\");\n        checkIsNotResponsive(FP, assert);\n        done();\n    }, 800*3);\n});"
  },
  {
    "path": "tests/unit/scrollBar.js",
    "content": "\n\nQUnit.test('Testing scrollBar:true & fiToSection: false', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {scrollBar: true, fitToSection: false});\n\n    assert.equal($('body').css('overflow'), 'visible', 'We expect body to have overflow:visible');\n    assert.equal($('html').css('overflow'), 'visible', 'We expect html to have overflow:visible');\n\n    assert.equal($('body')[0].style.height, 'initial', 'We expect body to have overflow:visible');\n    assert.equal($('html')[0].style.height, 'initial', 'We expect html to have overflow:visible');\n\n    assert.equal(FP.test.options.recordHistory, true, 'We expect recordHistory to be false');\n\n    assert.equal($(WRAPPER_SEL)[0].style.touchAction, '', 'We expect touchAction to be \"\"');\n});\n\n\nQUnit.test('Testing scrollBar:true & fiToSection: true', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {scrollBar: true, fitToSection: true});\n\n    assert.equal($('body').css('overflow'), 'auto scroll', 'We expect body to have overflow:visible');\n    assert.equal($('html').css('overflow'), 'auto hidden', 'We expect html to have overflow:visible');\n\n    assert.equal($('body')[0].style.height, 'initial', 'We expect body to have overflow:visible');\n    assert.equal($('html')[0].style.height, 'initial', 'We expect html to have overflow:visible');\n\n    assert.equal(FP.test.options.recordHistory, true, 'We expect recordHistory to be false');\n\n    assert.equal($(WRAPPER_SEL)[0].style.touchAction, '', 'We expect touchAction to be \"\"');\n});\n"
  },
  {
    "path": "tests/unit/scrollingSpeed.js",
    "content": "QUnit.test('Testing setScrollingSpeed 1000', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {scrollingSpeed: 1000});\n\n    FP.moveSectionDown();\n    assert.equal($(id).css('transition-duration'), '1s', 'We expect transition-duration to be 1s');\n});\n\nQUnit.test('Testing setScrollingSpeed 0', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {scrollingSpeed: 0});\n\n    FP.moveSectionDown();\n    assert.equal($(id).css('transition-duration'), '0s', 'We expect transition-duration to be 0s');\n});\n\nQUnit.test('Testing setScrollingSpeed for slides', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, {scrollingSpeed: 1000});\n\n    FP.moveSlideRight();\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).find(SLIDES_CONTAINER_SEL).css('transition-duration'), '1s', 'We expect transition-duration to be 1s');\n});"
  },
  {
    "path": "tests/unit/sectionsColor.js",
    "content": "var hexDigits = [\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"a\",\"b\",\"c\",\"d\",\"e\",\"f\"];\n\n//Function to convert rgb color to hex format\nfunction rgb2hex(rgb) {\n    rgb = rgb.match(/^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/);\n    return \"#\" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);\n}\n\nfunction hex(x) {\n    return isNaN(x) ? \"00\" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];\n}\n\nQUnit.test('Testing sectionsColor default', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, {});\n\n    for(var i = 0; i < $(SECTION_SEL).length; i++){\n        assert.equal($(SECTION_SEL)[i].style.backgroundColor, '', 'We expect sections to not have any backgroundColor');\n    }\n\n    for(var i = 0; i < $(SLIDE_SEL).length; i++){\n        assert.equal($(SLIDE_SEL)[i].style.backgroundColor, '', 'We expect slides to not have any backgroundColor');\n    }\n});\n\nQUnit.test('Testing sectionsColor with colors', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var colors = ['#ffffff', '#d8d8d8', '#123456', '#738312'];\n    var FP = initFullpageNew(id, {sectionsColor: colors});\n\n    for(var i = 0; i < $(SECTION_SEL).length; i++){\n        assert.equal(rgb2hex($(SECTION_SEL)[i].style.backgroundColor), colors[i], 'We expect sections to not have any backgroundColor');\n    }\n\n    //slides won't have any background\n    for(var i = 0; i < $(SLIDE_SEL).length; i++){\n        assert.equal($(SLIDE_SEL)[i].style.backgroundColor, '', 'We expect slides to not have any backgroundColor');\n    }\n});\n"
  },
  {
    "path": "tests/unit/selectors.js",
    "content": "QUnit.test('Testing sectionSelector default', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {});\n\n    assert.equal($(id).find(SECTION_SEL).length, $(id).find('.section').length, 'We expect sectonSelector to be .section by default');\n});\n\nQUnit.test('Testing slidesSelector default', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {});\n\n    assert.equal($(id).find(SLIDE_SEL).length, $(id).find('.slide').length, 'We expect slideSelector to be .slide by default');\n});\n\n\nQUnit.test('Testing a custom sectionSelector ', function(assert) {\n    var id = '#fullpage-custom-selector';\n    var customSelector = '.custom-section-selector';\n    var FP = initFullpageNew(id, {sectionSelector: customSelector});\n\n    assert.equal($(id).find(SECTION_SEL).length, $(id).find(customSelector).length, 'We expect sections to use a custom selector');\n});\n\nQUnit.test('Testing a custom slideSelector', function(assert) {\n    var id = '#fullpage-custom-slide-selector';\n    var customSelector = '.custom-slide-selector';\n    var FP = initFullpageNew(id, {slideSelector: customSelector});\n\n    assert.equal($(id).find(SLIDE_SEL).length, $(id).find(customSelector).length, 'We expect slides to use a custom selector');\n});\n\n\nQUnit.test('Testing multiple selectors for sections', function(assert) {\n    var id = '#fullpage-multiple-selectors';\n    var customSelector = '.selector1, .section';\n    try{\n        var FP = initFullpageNew(id, {sectionSelector: customSelector});\n        console.log(FP.getFullpageData().internals);\n        if(typeof FP.getFullpageData().internals === 'undefined'){\n            assert.equal('4', FP.getFullpageData().anchors.length, 'We expect 4 anchors');\n        }else{\n            assert.equal('4', FP.getFullpageData().options.anchors.length, 'We expect 4 anchors');\n        }\n    }catch(error){\n        console.warn(error);\n        assert.ok(false, 'Error initializing fullpage.js');\n    }\n});\n\n\n"
  },
  {
    "path": "tests/unit/setAllowScrolling.js",
    "content": "QUnit.test('Testing setAllowScrolling(true) with mouseWheel up & down', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {loopTop:true}));\n    var windowHeight = $(window).height();\n\n    FP.setAllowScrolling(true);\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    simulateMouseWheel('down');\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n    simulateMouseWheel('up');\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n});\n\n\nQUnit.test('Testing setAllowScrolling(false) with mouseWheel up & down', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {loopTop:true}));\n\n    FP.setAllowScrolling(false);\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    simulateMouseWheel('down');\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We don not expect section 2 to be active');\n    simulateMouseWheel('up');\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We don not expect section 2 to be active');\n});\n\nQUnit.test('Testing setAllowScrolling(false) with moveSectionUp & moveSectionDown', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {loopTop:true}));\n    var windowHeight = $(window).height();\n\n    FP.setAllowScrolling(false);\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    FP.moveSectionDown();\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n    FP.moveSectionUp();\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n});\n\nQUnit.test('Testing setAllowScrolling(false) with keydown down & up', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {scrollingSpeed:600, loopTop:true}));\n    var windowHeight = $(window).height();\n    var done = assert.async(2);\n\n    FP.setAllowScrolling(false);\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    simulateKeydown('down');\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n        simulateKeydown('up');\n        done();\n    },200);\n\n    setTimeout(function(){\n        assert.deepEqual(getTransform(FP.test.translate3d), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n        assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n        done();\n    },200*2);\n});\n\nQUnit.test('Testing setAllowScrolling(false, \"up\")', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {loopTop:true}));\n    var windowHeight = $(window).height();\n\n    FP.setAllowScrolling(false, 'up');\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    simulateMouseWheel('down');\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n    simulateMouseWheel('up');\n\n//scrolling up won't do anything\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n});\n\nQUnit.test('Testing setAllowScrolling(false, \"up, left\")', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {loopTop:true}));\n    var windowHeight = $(window).height();\n\n    FP.setAllowScrolling(false, 'up, left');\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n\n    simulateMouseWheel('down');\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n    simulateMouseWheel('up');\n\n//scrolling up won't do anything\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n    assert.equal($(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n    FP.moveSlideRight();\n\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, [`-1000`, '0', '0'], `We expect slides transformation to be [-1000, 0, 0]`);\n    assert.equal($(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 1, 'We expect slide 2.2 to be active');\n\n    //as we don't have horizontal scroll event, we use the control arrow to verify it\n    $(SECTION_ACTIVE_SEL).find(SLIDES_ARROW_SEL + SLIDES_PREV_SEL)[0].click();\n\n//sliding left won't do anything\n    var transforms = getTransform(FP.test.translate3dH[$(id).find(SECTION_ACTIVE_SEL).index()]);\n    assert.deepEqual(transforms, ['-1000', '0', '0'], `We expect slides transformation to be [-1000, 0, 0]`);\n    assert.equal($(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 1, 'We expect slide 2.2 to be active');\n});"
  },
  {
    "path": "tests/unit/setAutoScrolling.js",
    "content": "\nQUnit.test('Testing setAutoScrolling(true, external) {autoScrolling:true}', function(assert) {\n    var id = '#fullpage-2nd-active-section';\n    var FP = initFullpageNew(id, {autoScrolling:true, recordHistory:true});\n    var windowHeight = $('#qunit-fixture').height();\n\n    fullpage_api.setAutoScrolling(true, 'external');\n\n    assert.equal($('body').css('overflow'), 'hidden', 'body overflow should be hidden');\n    assert.equal($('html').css('overflow'), 'hidden', 'html should be hidden');\n\n    assert.equal(FP.test.options.recordHistory, true, 'recordHistory should be true');\n    assert.equal(FP.test.options.autoScrolling, true, 'autoScrolling should be true');\n\n    assert.equal($(id).css('touch-action'), 'none', 'touch action should be none');\n\n    assert.deepEqual(getTransform(FP.test.translate3d), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n});\n\n\nQUnit.test('Testing setAutoScrolling(false, external) {autoScrolling:false, fitToSection:false}', function(assert) {\n    var id = '#fullpage-2nd-active-section';\n    var FP = initFullpageNew(id, {autoScrolling:false, recordHistory:true, fitToSection:false});\n\n    fullpage_api.setAutoScrolling(false, 'external');\n\n    assert.equal($('body').css('overflow'), 'visible', 'overflow should be visible');\n    assert.equal($('html').css('overflow'), 'visible', 'html should be visible');\n\n    assert.equal(FP.test.options.recordHistory, false, 'recordHistory should be false');\n    assert.equal(FP.test.options.autoScrolling, false, 'autoScrolling should be false');\n\n    assert.equal($(id).css('touch-action'), 'auto', 'touch action should be auto');\n});\n\nQUnit.test('Testing setAutoScrolling(false, external) {autoScrolling:false, fitToSection:true}', function(assert) {\n    var id = '#fullpage-2nd-active-section';\n    var FP = initFullpageNew(id, {autoScrolling:false, recordHistory:true, fitToSection:true});\n\n    fullpage_api.setAutoScrolling(false, 'external');\n\n    assert.equal($('body').css('overflow'), 'auto scroll', 'overflow should be auto scroll');\n    assert.equal($('html').css('overflow'), 'auto hidden', 'html should be auto');\n\n    assert.equal(FP.test.options.recordHistory, false, 'recordHistory should be false');\n    assert.equal(FP.test.options.autoScrolling, false, 'autoScrolling should be false');\n\n    assert.equal($(id).css('touch-action'), 'auto', 'touch action should be auto');\n});\n\n\nQUnit.test('Testing setAutoScrolling(true, external) {scrollBar:true, fitToSection: false}', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {scrollBar:true, recordHistory: true, fitToSection: false});\n\n    fullpage_api.setAutoScrolling(true, 'external');\n\n    assert.equal($('body').css('overflow'), 'visible', 'overflow should be visible');\n    assert.equal($('html').css('overflow'), 'visible', 'html should be visible');\n\n    assert.equal($(id).css('touch-action'), 'auto', 'touch action should be auto');\n\n    assert.equal(FP.test.options.recordHistory, true, 'recordHistory should be false');\n    assert.equal(FP.test.options.autoScrolling, true, 'autoScrolling should be true');\n});"
  },
  {
    "path": "tests/unit/silentMoveTo.js",
    "content": "QUnit.test('Testing silentMoveTo vertical with anchor', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {scrollingSpeed: 1000}));\n    var windowHeight = $(window).height();\n\n    FP.silentMoveTo('page3');\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 2, 'We expect section 3 to be active');\n    assert.deepEqual(getTransformFromElement($(id)), ['0', `${-(windowHeight*2)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*2)}, 0]`);\n    assert.ok(FP.test.options.scrollingSpeed, 1000, 'We expect scrollingSpeed to be the samea s the initial one after the silent move');\n});\n\nQUnit.test('Testing silentMoveTo vertical with index', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {scrollingSpeed: 1000}));\n    var windowHeight = $(window).height();\n\n    FP.silentMoveTo('2');\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n    assert.deepEqual(getTransformFromElement($(id)), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n    assert.ok(FP.test.options.scrollingSpeed, 1000, 'We expect scrollingSpeed to be the samea s the initial one after the silent move');\n});\n\nQUnit.test('Testing silentMoveTo verticall + horizontal with anchors', function(assert) {\n    var id = '#fullpage-slides-with-anchor';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {scrollingSpeed: 1000}));\n    var windowHeight = $(window).height();\n\n    //moving to a specific slide within a section\n    FP.silentMoveTo('page2', 'slide3');\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n    assert.deepEqual(getTransformFromElement($(id)), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 2, 'We expect slide 2.3 to be active');\n    var slidesTranforms = getTransformFromElement($(id).find(SECTION_ACTIVE_SEL).find(SLIDES_CONTAINER_SEL));\n    assert.deepEqual(slidesTranforms, ['-2000', '0', '0'], 'We expect slides tranformation to be [-2000, 0, 0]');\n\n    assert.ok(FP.test.options.scrollingSpeed, 1000, 'We expect scrollingSpeed to be the samea s the initial one after the silent move');\n});\n\nQUnit.test('Testing silentMoveTo verticall + horizontal with index', function(assert) {\n    var id = '#fullpage-slides-with-anchor';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {scrollingSpeed: 1000}));\n    var windowHeight = $(window).height();\n\n    //moving to a specific slide within a section\n    FP.silentMoveTo('2', '2');\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 1, 'We expect section 2 to be active');\n    assert.deepEqual(getTransformFromElement($(id)), ['0', `${-(windowHeight*1)}`, '0'], `We expect sections transformation to be [0, ${-(windowHeight*1)}, 0]`);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 2, 'We expect slide 2.3 to be active');\n    var slidesTranforms = getTransformFromElement($(id).find(SECTION_ACTIVE_SEL).find(SLIDES_CONTAINER_SEL));\n    assert.deepEqual(slidesTranforms, ['-2000', '0', '0'], 'We expect slides tranformation to be [-2000, 0, 0]');\n\n    assert.ok(FP.test.options.scrollingSpeed, 1000, 'We expect scrollingSpeed to be the samea s the initial one after the silent move');\n});\n\nQUnit.test('Testing silentMoveTo horizontal only with anchor', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {scrollingSpeed: 1000}));\n    var windowHeight = $(window).height();\n\n    //moving to a specific slide within a section\n    FP.silentMoveTo('1', 'slide3');\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getTransformFromElement($(id)), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 2, 'We expect slide 1.3 to be active');\n    var slidesTranforms = getTransformFromElement($(id).find(SECTION_ACTIVE_SEL).find(SLIDES_CONTAINER_SEL));\n    assert.deepEqual(slidesTranforms, ['-2000', '0', '0'], 'We expect slides tranformation to be [-2000, 0, 0]');\n\n    assert.ok(FP.test.options.scrollingSpeed, 1000, 'We expect scrollingSpeed to be the samea s the initial one after the silent move');\n});\n\nQUnit.test('Testing silentMoveTo horizontal only with index', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {scrollingSpeed: 1000}));\n    var windowHeight = $(window).height();\n\n    //moving to a specific slide within a section\n    FP.silentMoveTo('1', '2');\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).index(), 0, 'We expect section 1 to be active');\n    assert.deepEqual(getTransformFromElement($(id)), ['0', '0', '0'], `We expect sections transformation to be [0, 0, 0]`);\n\n    assert.equal($(id).find(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index(), 2, 'We expect slide 1.3 to be active');\n    var slidesTranforms = getTransformFromElement($(id).find(SECTION_ACTIVE_SEL).find(SLIDES_CONTAINER_SEL));\n    assert.deepEqual(slidesTranforms, ['-2000', '0', '0'], 'We expect slides tranformation to be [-2000, 0, 0]');\n\n    assert.ok(FP.test.options.scrollingSpeed, 1000, 'We expect scrollingSpeed to be the samea s the initial one after the silent move');\n});"
  },
  {
    "path": "tests/unit/slidesNavigation.js",
    "content": "\nQUnit.test('Testing slidesNavigation exist when using slidesNavigation:true', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {slidesNavigation: true, scrollingSpeed: 50}));\n\n    assert.equal($(id).find(SLIDES_NAV_SEL).length, 1, 'We expect slidesNavigation to exist');\n    assert.equal($(id).find(SLIDES_NAV_SEL).closest(SECTION_SEL).index(), 1, 'We expect slidesNavigation to be inside the 2nd section');\n    assert.equal($(id).find(SLIDES_NAV_SEL).find('li').length, $(id).find(SECTION_SEL).eq(1).find(SLIDE_SEL).length, 'We expect slidesNavigation have as many items as slides exist');\n    assert.equal($(id).find(SLIDES_NAV_SEL).find('a').length, $(id).find(SECTION_SEL).eq(1).find(SLIDE_SEL).length, 'We expect slidesNavigation have as many links as sections exist');\n    assert.equal($(id).find(SLIDES_NAV_SEL).find('span').length, $(id).find(SECTION_SEL).eq(1).find(SLIDE_SEL).length * 2, 'We expect slidesNavigation have as many spans as sections exist');\n});\n\n\nQUnit.test('Testing slidesNavigation does not exist when using slidesNavigation:false', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {slidesNavigation: false}));\n\n    assert.equal($(id).find(SLIDES_NAV_SEL).length, 0, 'We expect no slidesNavigation to exist');\n});\n\n\nQUnit.test('Testing slidesNavigation `active` class when css3:true', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {slidesNavigation: true, css3:true, scrollingSpeed: 50}));\n    var done = assert.async(2);\n\n    assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 0, 'We expect item 1 to be active');\n    assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n\n    FP.moveSlideRight();\n\n    setTimeout(function() {\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 1, `We expect item 1 to be active`);\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n\n        done();\n        FP.moveSlideRight();\n    }, 100);\n\n    setTimeout(function() {\n        FP.moveSlideRight();\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 2, `We expect item 2 to be active`);\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n\n        done();\n    }, 100 * 2);\n});\n\n\n\nQUnit.test('Testing slidesNavigation `active` class when css3:false', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {slidesNavigation: true, css3:false, scrollingSpeed: 50}));\n    var done = assert.async(2);\n\n    assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 0, 'We expect item 1 to be active');\n    assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n\n    FP.moveSlideRight();\n\n    setTimeout(function() {\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 1, `We expect item 2 to be active`);\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n\n        done();\n        FP.moveSlideRight();\n    }, 100);\n\n    setTimeout(function() {\n        FP.moveSlideRight();\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 2, `We expect item 2 to be active`);\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n\n        done();\n    }, 100 * 2);\n});\n\n\nQUnit.test('Testing slidesNavigation `active` class when hash change by anchor name within same section', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {slidesNavigation: true, scrollingSpeed: 50}));\n\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 0, 'We expect item 1 to be active');\n    assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n\n    window.location.hash = '#page1/slide3';\n\n    setTimeout(function(){\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 2, 'We expect item 3 to be active');\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n        done();\n    },100);\n});\n\n\nQUnit.test('Testing slidesNavigation `active` class when hash change by slide index within same section', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {slidesNavigation: true, scrollingSpeed: 50}));\n\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 0, 'We expect item 1 to be active');\n    assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n\n    window.location.hash = '#page1/2';\n\n    setTimeout(function(){\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 2, 'We expect item 3 to be active');\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n        done();\n    },100);\n});\n\nQUnit.test('Testing slidesNavigation `active` class when hash change to another section & slide', function(assert) {\n    var id = '#fullpage-slides-with-anchor';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {slidesNavigation: true, scrollingSpeed: 50}));\n\n    var done = assert.async(1);\n\n    assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 0, 'We expect item 1 to be active');\n    assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n\n    window.location.hash = '#page2/slide3';\n\n    setTimeout(function(){\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 2, 'We expect item 3 to be active');\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n        done();\n    },100*2);\n});\n\n$(document).on('click', SLIDES_NAV_LINK_SEL, function(){\n    console.log(\"weeee\");\n});\n\nQUnit.test('Testing slide by click on slidesNavigation ', function(assert) {\n    var id = '#fullpage-moveSlideRight';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {slidesNavigation: true, scrollingSpeed: 50}));\n\n    var done = assert.async(1);\n\n    $(id).find(SLIDES_NAV_SEL).find('li').eq(2).find('a')[0].click();\n\n    setTimeout(function(){\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').index(), 2, 'We expect item 3 to be active');\n        assert.equal($(id).find(SLIDES_NAV_SEL).find(ACTIVE_SEL).closest('li').length, 1, 'We expect a single item to be active');\n        done();\n    },100);\n});\n\n\nQUnit.test('Testing slidesNavPosition:bottom', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {slidesNavigation: true, slidesNavPosition:'bottom', scrollingSpeed: 50}));\n\n    assert.ok($(id).find(SLIDES_NAV_SEL).hasClass('fp-bottom'), 'We expect slidesNav to have class fp-bottom');\n});\n\n\nQUnit.test('Testing slidesNavPosition:top', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, Object.assign({}, allBasicOptions, {slidesNavigation: true, slidesNavPosition:'top', scrollingSpeed: 50}));\n\n    assert.ok($(id).find(SLIDES_NAV_SEL).hasClass('fp-top'), 'We expect slidesNav to have class fp-top');\n});\n\n"
  },
  {
    "path": "tests/unit/verticalCentered.js",
    "content": "\nQUnit.test('Testing verticalCentered:true', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {verticalCentered: true});\n    var windowHeight = $(window).height();\n\n    assert.equal($(id).find(TABLE_SEL).length, 7, 'We expect TABLE_SEL to exist for every section/slide');\n    assert.equal($(id).find(TABLE_SEL).eq(0).closest(SECTION_SEL).length, 1, 'We expect TABLE_SEL to exist as a child of section');\n    assert.equal($(id).find(TABLE_SEL).eq(1).closest(SLIDE_SEL).length, 1, 'We expect TABLE_SEL to exist as a child of slide within a slider');\n});\n\nQUnit.test('Testing verticalCentered:false', function(assert) {\n    var id = '#fullpage';\n    var FP = initFullpageNew(id, {verticalCentered: false});\n\n    assert.equal($(id).find(TABLE_SEL).length,0, 'We expect TABLE_SEL to exist for every section/slide');\n});\n\nQUnit.test('Testing verticalCentered:true + paddingTop', function(assert) {\n    var id = '#fullpage';\n    var padding = 10;\n    var FP = initFullpageNew(id, {verticalCentered: true, paddingTop: padding + 'px'});\n    var windowHeight = $(window).height();\n\n    assert.equal($(TABLE_SEL).length, 7, 'We expect TABLE_SEL to exist for every section/slide');\n    assert.equal($(TABLE_SEL).eq(0).css('height'), (windowHeight)+'px', 'We expect TABLE_SEL to exist for every section/slide');\n});\n\nQUnit.test('Testing verticalCentered:true + paddingBottom', function(assert) {\n    var id = '#fullpage';\n    var padding = 10;\n    var FP = initFullpageNew(id, {verticalCentered: true, paddingBottom: padding + 'px'});\n    var windowHeight = $(window).height();\n\n    assert.equal($(TABLE_SEL).length, 7, 'We expect TABLE_SEL to exist for every section/slide');\n    assert.equal($(TABLE_SEL).eq(0).css('height'), (windowHeight)+'px', 'We expect TABLE_SEL to exist for every section/slide');\n});\n\n\n// QUnit.test('Testing verticalCentered:true + scrollOverflow:true', function(assert) {\n//     var id = '#fullpage-scrolloverflow';\n//     var FP = initFullpageNew(id, {verticalCentered: true, scrollOverflow: true});\n\n//     assert.equal($(id).find(OVERFLOW_SEL)[0].scrollHeight, 2000, 'We expect scrolloverfow to create a scrollable element');\n//     assert.equal($(id).find(OVERFLOW_SEL).css('display'), 'block', 'We expect the scrollable to not be display: flex, so it can contain bigger elements than the parent.'); \n\n// });\n"
  },
  {
    "path": "tests/utils.js",
    "content": "var sectionLoaded = [];\nvar slideLoaded = [];\n\n// keeping central set of classnames and selectors\nvar WRAPPER =               'fullpage-wrapper';\nvar WRAPPER_SEL =           '.' + WRAPPER;\n\n// slimscroll\nvar SCROLLABLE =            'fp-scrollable';\nvar SCROLLABLE_SEL =        '.' + SCROLLABLE;\nvar OVERFLOW =              'fp-overflow';\nvar OVERFLOW_SEL =              '.' + OVERFLOW;\n\n// util\nvar RESPONSIVE =            'fp-responsive';\nvar NO_TRANSITION =         'fp-notransition';\nvar DESTROYED =             'fp-destroyed';\nvar ENABLED =               'fp-enabled';\nvar VIEWING_PREFIX =        'fp-viewing';\nvar ACTIVE =                'active';\nvar ACTIVE_SEL =            '.' + ACTIVE;\nvar COMPLETELY =            'fp-completely';\nvar COMPLETELY_SEL =        '.' + COMPLETELY;\n\n// section\nvar SECTION_DEFAULT_SEL =   '.section';\nvar SECTION =               'fp-section';\nvar SECTION_SEL =           '.' + SECTION;\nvar SECTION_ACTIVE_SEL =    SECTION_SEL + ACTIVE_SEL;\nvar SECTION_FIRST_SEL =     SECTION_SEL + ':first';\nvar SECTION_LAST_SEL =      SECTION_SEL + ':last';\nvar TABLE =                 'fp-table';\nvar TABLE_SEL =             '.' + TABLE;\nvar TABLE_CELL =            'fp-tableCell';\nvar TABLE_CELL_SEL =        '.' + TABLE_CELL;\nvar AUTO_HEIGHT =           'fp-auto-height';\nvar AUTO_HEIGHT_SEL =       '.fp-auto-height';\nvar NORMAL_SCROLL =         'fp-normal-scroll';\nvar NORMAL_SCROLL_SEL =     '.fp-normal-scroll';\n\n// section nav\nvar SECTION_NAV =           'fp-nav';\nvar SECTION_NAV_SEL =       '#' + SECTION_NAV;\nvar SECTION_NAV_TOOLTIP =   'fp-tooltip';\nvar SECTION_NAV_TOOLTIP_SEL='.'+SECTION_NAV_TOOLTIP;\nvar SHOW_ACTIVE_TOOLTIP =   'fp-show-active';\n\n// slide\nvar SLIDE_DEFAULT_SEL =     '.slide';\nvar SLIDE =                 'fp-slide';\nvar SLIDE_SEL =             '.' + SLIDE;\nvar SLIDE_ACTIVE_SEL =      SLIDE_SEL + ACTIVE_SEL;\nvar SLIDES_WRAPPER =        'fp-slides';\nvar SLIDES_WRAPPER_SEL =    '.' + SLIDES_WRAPPER;\nvar SLIDES_CONTAINER =      'fp-slidesContainer';\nvar SLIDES_CONTAINER_SEL =  '.' + SLIDES_CONTAINER;\nvar TABLE =                 'fp-table';\n\n// slide nav\nvar SLIDES_NAV =            'fp-slidesNav';\nvar SLIDES_NAV_SEL =        '.' + SLIDES_NAV;\nvar SLIDES_NAV_LINK_SEL =   SLIDES_NAV_SEL + ' a';\nvar SLIDES_ARROW =          'fp-controlArrow';\nvar SLIDES_ARROW_SEL =      '.' + SLIDES_ARROW;\nvar SLIDES_PREV =           'fp-prev';\nvar SLIDES_PREV_SEL =       '.' + SLIDES_PREV;\nvar SLIDES_ARROW_PREV =     SLIDES_ARROW + ' ' + SLIDES_PREV;\nvar SLIDES_ARROW_PREV_SEL = SLIDES_ARROW_SEL + SLIDES_PREV_SEL;\nvar SLIDES_NEXT =           'fp-next';\nvar SLIDES_NEXT_SEL =       '.' + SLIDES_NEXT;\nvar SLIDES_ARROW_NEXT =     SLIDES_ARROW + ' ' + SLIDES_NEXT;\nvar SLIDES_ARROW_NEXT_SEL = SLIDES_ARROW_SEL + SLIDES_NEXT_SEL;\n\nvar new_fullpage;\nvar oldConsole = console;\n\nvar lazyLoadElements =  `\n    <img id=\"img-src\" data-src=\"https://www.w3schools.com/html/pulpitrock.jpg\" />\n\n    <img id=\"img-srcet\" data-srcset=\"https://www.w3schools.com/html/pulpitrock.jpg 320w, https://www.w3schools.com/html/pulpitrock.jpg 420w\" />\n\n    <video width=\"320\" height=\"240\" controls>\n        <source class=\"source-src\" data-src=\"https://www.w3schools.com/html/mov_bbb.mp4\" type=\"video/mp4\">\n        <source class=\"source-src\" data-src=\"https://www.w3schools.com/html/mov_bbb.ogg\" type=\"video/ogg\">\n        Your browser does not support the video tag.\n    </video>\n\n    <video id=\"source-srcset\" width=\"320\" height=\"240\" controls>\n        <source class=\"source-srcset\" data-srcset=\"https://www.w3schools.com/html/mov_bbb.mp4 768w, videos/tablet-video.mp4 1200w\">\n        <source class=\"source-srcset\" data-srcset=\"https://www.w3schools.com/html/mov_bbb.mp4 768w, videos/tablet-video.mp4 1200w\">\n    </video>\n\n    <video id=\"video-src\" data-src=\"https://www.w3schools.com/html/mov_bbb.ogg\" controls>\n        Your browser does not support the video tag.\n    </video>\n\n    <audio id=\"audio-src\" data-src=\"https://www.w3schools.com/html/horse.ogg\" controls>\n        Your browser does not support the audio element.\n    </audio>\n\n    <iframe id=\"iframe-src\" data-src=\"http://google.com\"></iframe>\n\n    <picture>\n        <source data-srcset=\"https://www.w3schools.com/html/pulpitrock.jpg?v=1\" media=\"(min-width: 1440px)\">\n        <source data-srcset=\"https://www.w3schools.com/html/pulpitrock.jpg?v=2\" media=\"(min-width: 1024px)\">\n        <img class=\"background-image background-image-lazy\" data-src=\"https://www.w3schools.com/html/pulpitrock.jpg?v=3\">\n    </picture>\n`;\n\nfunction areAllLazyLoaded(element){\n    var lazyLoadElements = element.find('[data-src], [data-srcset]');\n    return !lazyLoadElements.length;\n}\n\nfunction isAnyLazyLoaded(element){\n    return element.find('[src], [srcset]').length;\n}\n\nfunction areOthersLazyLoaded(){\n    var isAnyOtherLoaded = false;\n    $(SECTION_SEL).each(function(){\n        var section = $(this);\n        var slides = $(this).find(SLIDE_SEL);\n        if(slides.length){\n\n            slides.each(function(){\n                var slide = $(this);\n                if(!section.hasClass(ACTIVE) || section.hasClass(ACTIVE) && !slide.hasClass(ACTIVE)){\n                    isAnyOtherLoaded = isAnyOtherLoaded || isAnyLazyLoaded(slide);\n                }\n            });\n\n        }\n        else if(!section.hasClass(ACTIVE)){\n            isAnyOtherLoaded = isAnyOtherLoaded || isAnyLazyLoaded(section);\n        }\n    });\n    return isAnyOtherLoaded;\n}\n\n//appends lazy elements to all sections and slides\nfunction appendLazyElements(id){\n    $(id).find('.section').each(function(index, section){\n        var slides = $(section).find('.slide');\n        if(slides.length){\n            slides.append(lazyLoadElements);\n        }\n        else{\n            $(section).append(lazyLoadElements);\n        }\n    });\n}\n\nvar sectionsCallbacks = {\n    afterLoad: function(anchorLink, index) {\n        sectionLoaded[index - 1] = true;\n        afterLoad = `${anchorLink}, ${index}`;\n    },\n    onLeave: function(index, nextIndex, direction) {\n        sectionLoaded[index - 1] = false;\n        onLeave = `${index}, ${nextIndex}, ${direction}`;\n    },\n    afterRender() {\n        afterRender = [$(SECTION_ACTIVE_SEL).index(), $(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index()];\n    },\n    afterResponsive: function(isResponsive){\n        afterResponsive = isResponsive;\n    },\n    afterResize: function(){\n        afterResize = true;\n    },\n    afterReBuild: function(){\n        afterReBuild = true;\n    }\n};\n\n\nvar sectionsCallbacksV3 = {\n    afterLoad: function(origin, destination, direction) {\n        sectionLoaded[destination.index ] = true;\n        afterLoad = {\n            origin: origin,\n            destination: destination,\n            direction: direction\n        };\n    },\n    onLeave: function(origin, destination, direction) {\n        sectionLoaded[origin.index] = false;\n        console.log(origin);\n        console.log(destination);\n        onLeave = {\n            origin: origin,\n            destination: destination,\n            direction: direction\n        };\n        console.log(\"-------\");\n    },\n    afterRender() {\n        afterRender = [$(SECTION_ACTIVE_SEL).index(), $(SECTION_ACTIVE_SEL).find(SLIDE_ACTIVE_SEL).index()];\n    },\n    afterResponsive: function(isResponsive){\n        afterResponsive = isResponsive;\n    },\n    afterResize: function(width, height){\n        afterResize = `${width}, ${height}`;\n    },\n    afterReBuild: function(){\n        afterReBuild = true;\n    }\n};\n\n\n$('html').click(function(){\n    $(window).trigger('pepe');\n});\n\nvar onSlideLeave = new_fullpage ? {} : ``;\nvar onLeave = new_fullpage ? {} : ``;\nvar afterLoad = new_fullpage ? {} : ``;\nvar afterSlideLoad = new_fullpage ? {} : ``;\n\nvar afterResponsive = false;\nvar afterResize = false;\nvar afterReBuild = false;\nvar afterRender = [];\nvar locationReplace = null;\n\nvar slidesCallbacks = {\n    afterSlideLoad: function(anchorLink, index, slideAnchor, slideIndex){\n        slideLoaded[slideIndex] = true;\n        afterSlideLoad = `${anchorLink}, ${index}, ${slideAnchor}, ${slideIndex}`;\n    },\n    onSlideLeave: function(anchorLink, index, slideIndex, direction, nextSlideIndex){\n        slideLoaded[slideIndex] = false;\n        onSlideLeave = `${anchorLink}, ${index}, ${slideIndex}, ${direction}, ${nextSlideIndex}`;\n    }\n};\n\n\nvar slidesCallbacksV3 = {\n    afterSlideLoad: function(section, origin, destination, direction){\n        slideLoaded[destination.index] = true;\n        afterSlideLoad = {\n            section: section,\n            origin: origin,\n            destination: destination,\n            direction: direction\n        };\n    },\n    onSlideLeave: function(section, origin, destination, direction){\n        slideLoaded[origin.index] = false;\n        onSlideLeave = {\n            section: section,\n            origin: origin,\n            destination: destination,\n            direction: direction\n        };\n    }\n};\n\nvar anchors = { anchors: ['page1', 'page2', 'page3', 'page4']};\n\nvar sectionsAndSlidesCallbacks = Object.assign({}, sectionsCallbacks, slidesCallbacks);\nvar sectionsAndSlidesCallbacksV3 = Object.assign({}, sectionsCallbacksV3, slidesCallbacksV3);\n\nvar allBasicOptions =  Object.assign({}, anchors, sectionsCallbacks, slidesCallbacks);\nvar allBasicOptionsV3 =  Object.assign({}, anchors, sectionsCallbacksV3, slidesCallbacksV3);\n\n\nfunction getTransform(translate) {\n    var translateRegex = new RegExp('translate3d\\\\((.*)px,\\\\s(.*)px,\\\\s(.*)px\\\\)');\n    var parts = translateRegex.exec(translate);\n\n    parts = parts.map(function(item){\n        return item == '-0' ? 0: item;\n    });\n\n    return [''+parts[1]+'', ''+parts[2]+'', ''+parts[3]+''];\n}\n\nfunction getTransformFromElement($el) {\n    var results = $el.css('-webkit-transform').match(/matrix(?:(3d)\\(-{0,1}\\d+(?:, -{0,1}\\d+)*(?:, (-{0,1}\\d+))(?:, (-{0,1}\\d+))(?:, (-{0,1}\\d+)), -{0,1}\\d+\\)|\\(-{0,1}\\d+(?:, -{0,1}\\d+)*(?:, (-{0,1}\\d+))(?:, (-{0,1}\\d+))\\))/);\n\n    if(!results) return [\"0\", \"0\", \"0\"];\n    if(results[1] == '3d') return results.slice(2,5);\n\n    results.push(\"0\");\n    return results.slice(5, 8);\n}\n\nfunction getWindowPosition(){\n    return $(window).scrollTop();\n}\n\nfunction getTop(selector){\n    return $(selector).css('top');\n}\n\n//overwritting the scrollTop function of jQuery to simulate scroll\n//when using autoScrolling:false or scrollBar:true\nfunction simulateScroll(scrollValue, FP){\n    if(FP && FP.test.options.fitToSection){\n        console.warn(\"-. ENTRA.....................\");\n        document.body.scrollTo(0, scrollValue);\n    }\n    else{\n        window.pageYOffset = (function(){\n            return scrollValue;\n        })();\n    }\n\n    trigger(window, 'scroll');\n}\n\nfunction showFullpage(id){\n    console.log(\"showing...\");\n    jQuery(id).show();\n    $('#qunit').hide();\n    $('#qunit-fixture').addClass('show-fixture');\n}\nwindow.showFullpage = showFullpage;\n\nfunction showQunit(id){\n    $(id).hide();\n    $('#qunit').show();\n    $('#qunit-fixture').removeClass('show-fixture');\n}\nwindow.showQunit = showQunit;\n\nfunction simulateMouseWheel(type){\n    var multiplier = type === 'up' ? -1 : 1;\n\n    //moving down with mouse wheel\n    var mouseWheel = new Event('wheel', { 'bubbles': true });\n    mouseWheel.deltaY = 10 * multiplier;\n    document.dispatchEvent(mouseWheel);\n}\n\nfunction simulateKeydown(type){\n    var keyCode = type === 'up' ? 38 : 40;\n\n    //moving down with mouse wheel\n    var keydownEvent = new Event('keydown', { 'bubbles': true });\n    keydownEvent.keyCode = keyCode;\n    document.dispatchEvent(keydownEvent);\n}\n\n//not used yet\nfunction simulateTouchMove(target, type){\n    var pageY = 100, pageX = 100, differenceX = 0, differenceY = 0;\n\n    switch(type){\n        case 'down': differenceY = 500; break;\n        case 'up': differenceY = -500; break;\n        case 'left': differenceX = 500;break;\n        case 'right': differenceX = -500; break;\n    }\n\n    //touch start\n    var touchStartEvent = new Event('touchstart', { 'bubbles': true });\n    touchStartEvent.pageX = pageX + differenceX;\n    touchStartEvent.pageY = pageY + differenceY;\n    target.dispatchEvent(touchStartEvent);\n\n    //moving down with mouse wheel\n    var touchMoveEvent = new Event('touchmove', { 'bubbles': true });\n    touchMoveEvent.pageX = pageX;\n    touchMoveEvent.pageY = pageY;\n    target.dispatchEvent(touchMoveEvent);\n}\n\n\nfunction trigger(el, eventName, data){\n    var event;\n    data = typeof data === 'undefined' ? {} : data;\n\n    var windowEvents = ['resize', 'focus', 'blur'];\n\n    debugger;\n    if(windowEvents.indexOf(eventName) > -1){\n        \n        event = new Event(eventName);\n        event.details = data;\n    }\n    // Native\n    else if (window.CustomEvent) {\n        event = new CustomEvent(eventName, {detail: data});\n    }\n    else{\n        event = document.createEvent('CustomEvent');\n        event.initCustomEvent(eventName, true, true, data);\n    }\n\n    el.dispatchEvent(event);\n}\n\nfunction destroyTest(){\n    //destroying it if it existed\n    if(window.fullpage_api != null){\n        window.fullpage_api.destroy('all');\n    }\n\n    else if($.fn.fullpage != null){\n        $.fn.fullpage.destroy('all');\n    }\n\n    console.warn = oldConsole.warn;\n    console.log = oldConsole.log;\n    console.error = oldConsole.error;\n\n    //removing the  URL hash\n    window.location.hash = '';\n\n    //resetting the loaded sections array flag\n    $.each(sectionLoaded, function(index, value) {\n        sectionLoaded[index] = false;\n    });\n\n    $('.fullpage-layout.active').removeClass('active');\n    onSlideLeave = ``;\n    onLeave = ``;\n    afterLoad = ``;\n    afterSlideLoad = ``;\n    afterResponsive = false;\n    afterResize = false;\n    afterReBuild = false;\n    afterRender = [];\n    locationReplace = null;\n}\n\nfunction setLoadedState(){\n    sectionLoaded = [];\n    slideLoaded = [];\n\n    // \"Loaded\" flag for each section to fill \"onLoad\"\n    $('.section:visible').each(function(index) {\n        sectionLoaded.push(false);\n    });\n    $('.slide:visible').each(function(index){\n        slideLoaded.push(false);\n    });\n}\n\nfunction areOthersLoaded(elements){\n    return elements.filter(function(x){\n        return x === true;\n    }).length;\n}\n\nfunction initFullpage(id, options){\n    $(id).addClass('active');\n    setLoadedState();\n    $(id).fullpage(options);\n}\n\nfunction initFullpageNew(id, options){\n    $(id).addClass('active');\n    setLoadedState();\n\n    new_fullpage = new window.fullpage(id, options);\n    new_fullpage.test.isTesting = true;\n    return new_fullpage;\n}\n\nQUnit.module(\"module\", {\n    beforeEach: function(assert) {\n        console.warn(assert.test.testName);\n    },\n    afterEach: function(assert) {\n        destroyTest();\n    }\n});"
  },
  {
    "path": "types/index.d.ts",
    "content": "\nexport type Item = {\n    anchor: string | number,\n    index: number,\n    item: HTMLElement,\n    isFirst: boolean,\n    isLast: boolean\n};\n\ntype DragAndMove = boolean | \"vertical\" | \"horizontal\" | \"fingersonly\" | \"mouseonly\";\ntype FadingEffect = boolean | \"sections\" | \"slides\";\ntype InterlockedSlides = boolean | Array<number>;\ntype bigSectionsDestination = \"top\" | \"bottom\" | null;\ntype Parallax = boolean | \"sections\" | \"slides\";\ntype DropEffect = boolean | \"sections\" | \"slides\";\ntype WaterEffect = boolean | \"sections\" | \"slides\";\ntype SkipIntermediateItems = boolean | \"sections\" | \"slides\";\ntype Trigger = \"slideArrow\" | \"verticalNav\" | \"horizontalNav\" | \"keydown\" | \"wheel\" | \"menu\";\ntype ScrollOverflowReset = boolean | \"slides\" | \"sections\";\ntype Effects = boolean | string;\ntype Cinematic = boolean | string;\ntype WaterEffectOptions = {\n    animateContent: boolean\n    animateOnMouseMove: boolean\n};\ntype CardsOptions = {\n    perspective: number\n    fadeContent: boolean\n    fadeBackground: boolean\n};\ntype ParallaxOptions = {\n    percentage?: number\n    property?: \"translate\" | \"background\"\n    type?: \"reveal\" | \"cover\"\n};\n\ntype CinematicContentDirection = 'auto' | 'vertical' | 'horizontal' | 'none';\ntype CinematicOptions = {\n    animateContent: true;\n    contentDistance: number;\n    contentEasing: string;\n    contentDirection: CinematicContentDirection;\n};\n\ntype EffectsOptions = {\n    scale?: {\n        past?: number,\n        future?: number\n    },\n    offset?: {\n        past?: number,\n        future?: number\n    },\n    opacity?: {\n        past?: number,\n        future?: number\n    },\n    delay?: {\n        past?: number,\n        future?: number\n    },\n    visibility?: {\n        past?: string\n    },\n    rotate?: {\n        past?: string,\n        future?: string\n    },\n    transformOrigin?: {\n        past?: string,\n        future?: string\n    },\n    perspective?: number,\n    zIndex?: string,\n    skew?: number,\n    useShadow?: boolean,\n    shadow?: string\n};\n\ntype Credits = {\n    enabled?: boolean,\n    label?: string,\n    position?: \"left\" | \"right\"\n}\n\nexport interface fullpageOptions {\n    anchors?: string[]\n    animateAnchor?: boolean\n    autoScrolling?: boolean\n    bigSectionsDestination?: bigSectionsDestination //top, bottom, null\n    continuousHorizontal?: boolean\n    continuousVertical?: boolean\n    controlArrowColor?: string\n    controlArrows?: boolean\n    controlArrowsHTML?: string[]\n    css3?: boolean\n    dragAndMove?: DragAndMove\n    easing?: string\n    easingcss3?: string\n    fadingEffect?: FadingEffect\n    fitToSection?: boolean\n    fitToSectionDelay?: number\n    fixedElements?: string // '#header, .footer'\n    hybrid?: boolean\n    interlockedSlides?: InterlockedSlides\n    keyboardScrolling?: boolean\n    lazyLoading?: boolean\n    lazyLoadThreshold?: number\n    observer?: boolean\n    licenseKey?: string\n    credits: Credits\n    lockAnchors?: boolean\n    loopBottom?: boolean\n    loopHorizontal?: boolean\n    loopTop?: boolean\n    menu?: string\n    navigation?: boolean\n    navigationPosition?: string\n    navigationTooltips?: string[] // ['firstSlide', 'secondSlide']\n    normalScrollElementTouchThreshold?: number\n    normalScrollElements?: string // '#element1, .element2',\n    offsetSections?: boolean\n    paddingBottom?: string\n    paddingTop?: string\n    parallax?: Parallax // true, false, 'sections', 'slides'\n    parallaxOptions?: ParallaxOptions\n    effects?: Effects\n    effectsOptions?: EffectsOptions\n    recordHistory?: boolean\n    resetSliders?: boolean\n    responsive?: number\n    responsiveHeight?: number\n    responsiveSlides?: boolean\n    responsiveWidth?: number\n    scrollBar?: boolean\n    scrollHorizontally?: boolean\n    scrollOverflow?: boolean\n    scrollOverflowMacStyle?: boolean\n    scrollOverflowHandler?: any\n    scrollOverflowReset?: ScrollOverflowReset\n    skipIntermediateItems?: SkipIntermediateItems\n    scrollingSpeed?: number\n    dropEffect?: DropEffect;\n    dropEffectOptions?: any;\n    waterEffect?: WaterEffect;\n    waterEffectOptions?: WaterEffectOptions;\n    cards?: boolean;\n    cardsOptions?: CardsOptions;\n    sectionSelector?: string\n    sectionsColor?: string[]\n    showActiveTooltip?: boolean\n    slideSelector?: string\n    slidesNavPosition?: \"top\" | \"bottom\"\n    slidesNavigation?: boolean\n    touchSensitivity?: number\n    verticalCentered?: boolean\n\n    /* callback and events */\n    afterLoad?(origin: Item, destination: Item, direction: string, trigger: Trigger): void\n    afterRender?(): void\n    afterResize?(width: number, height: number): void\n    afterReBuild?(): void\n    afterResponsive?(isResponsive: boolean): void\n    afterSlideLoad?(section: Item, origin: Item, destination: Item, direction: string, trigger: Trigger): void\n    onLeave?(origin: Item, destination: Item, direction: string, trigger: Trigger): void\n    beforeLeave?(origin: Item, destination: Item, direction: string, trigger: Trigger): void\n    onSlideLeave?(section: Item, origin: Item, destination: Item, direction: string, trigger: Trigger): void\n    onScrollOverflow?(section: Item, slide: Item, position: number, direction: string): void\n\n    /* keys for extensions */\n    fadingEffectKey?: string\n    responsiveSlidesKey?: string\n    continuousHorizontalKey?: string\n    interlockedSlidesKey?: string\n    scrollHorizontallyKey?: string\n    resetSlidersKey?: string\n    offsetSectionsKey?: string\n    dragAndMoveKey?: string\n    parallaxKey?: string\n    scrollOverflowResetKey?: string\n    effectsKey?: string\n    cardsKey?: string\n    waterEffectKey?: string\n    dropEffectKey?: string\n    /* end key sections */\n}\n\nexport interface fullpageApi {\n    continuousHorizontal: boolean\n    dragAndMove: DragAndMove\n    fadingEffect: FadingEffect\n    interlockedSlides: InterlockedSlides\n    offsetSections: boolean\n    parallax: Parallax\n    resetSliders: boolean\n    responsiveSlides: boolean\n    scrollHorizontally: boolean\n    scrollOverflowReset: ScrollOverflowReset\n    version: string\n    destroy(type?: string): void\n    fitToSection(): void\n    getActiveSection(): Item\n    getActiveSlide(): Item\n    getFullpageData(): any\n    landscapeScroll(e?: any, t?: any, n?: any): void\n    getScrollY(): number\n    getScrollX(): number\n    moveSectionDown(): void\n    moveSectionUp(): void\n    moveSlideLeft(): void\n    moveSlideRight(): void\n    moveTo(section: string | number, slide?: string | number): void\n    reBuild(isResizing?: boolean): void\n    setAllowScrolling(value: boolean, directions?: string): void\n    setAutoScrolling(value: boolean, type?: string): void\n    setFitToSection(value: boolean, type?: string): void\n    setKeyboardScrolling(value: boolean, directions?: string): void\n    setLockAnchors(value: boolean): void\n    setMouseWheelScrolling(value: boolean): void\n    setRecordHistory(value: boolean, type?: string): void\n    setResponsive(value: boolean): void\n    setScrollingSpeed(value: number, type?: string): void\n    silentMoveTo(sectionAnchor: string | number, slideAnchor?: string | number): void\n    shared: {\n        afterRenderActions(): void\n    }\n    test: {\n        left: number[]\n        top: string\n        translate3d: string\n        translate3dH: string[]\n        setAutoScrolling(value: boolean, type?: string): void\n        options: fullpageOptions\n    }\n}\n\ninterface FullPageProps extends fullpageOptions {\n    licenseKey?: string\n    render: (comp: { state: any; fullpageApi: fullpageApi }) => React.ReactElement | void\n    debug?: boolean\n    pluginWrapper?: () => void\n}\n\nclass ReactFullpage extends React.Component<FullPageProps>{ }\n\ninterface WrapperProps {\n    children: React.ReactNode\n}\n\nnamespace ReactFullpage {\n    function Wrapper(props: WrapperProps): React.ReactElement\n}"
  },
  {
    "path": "vendors/easings.js",
    "content": "/*!\n * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/\n *\n * Uses the built in easing capabilities added In jQuery 1.1\n * to offer multiple easing options\n *\n * TERMS OF USE - jQuery Easing\n *\n * Open source under the BSD License.\n *\n * Copyright 2008 George McGinley Smith\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n *\n * Neither the name of the author nor the names of contributors may be used to endorse\n * or promote products derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n*/\nwindow.fp_easings = {\n    def: 'easeOutQuad',\n    linear: function (t, b, c, d) {\n        return c*t/d + b\n    },\n    swing: function (t, b, c, d) {\n        return window.fp_easings[window.fp_easings.def](t, b, c, d);\n    },\n    easeInQuad: function (t, b, c, d) {\n        return c*(t/=d)*t + b;\n    },\n    easeOutQuad: function (t, b, c, d) {\n        return -c *(t/=d)*(t-2) + b;\n    },\n    easeInOutQuad: function (t, b, c, d) {\n        if ((t/=d/2) < 1) return c/2*t*t + b;\n        return -c/2 * ((--t)*(t-2) - 1) + b;\n    },\n    easeInCubic: function (t, b, c, d) {\n        return c*(t/=d)*t*t + b;\n    },\n    easeOutCubic: function (t, b, c, d) {\n        return c*((t=t/d-1)*t*t + 1) + b;\n    },\n    easeInOutCubic: function (t, b, c, d) {\n        if ((t/=d/2) < 1) return c/2*t*t*t + b;\n        return c/2*((t-=2)*t*t + 2) + b;\n    },\n    easeInQuart: function (t, b, c, d) {\n        return c*(t/=d)*t*t*t + b;\n    },\n    easeOutQuart: function (t, b, c, d) {\n        return -c * ((t=t/d-1)*t*t*t - 1) + b;\n    },\n    easeInOutQuart: function (t, b, c, d) {\n        if ((t/=d/2) < 1) return c/2*t*t*t*t + b;\n        return -c/2 * ((t-=2)*t*t*t - 2) + b;\n    },\n    easeInQuint: function (t, b, c, d) {\n        return c*(t/=d)*t*t*t*t + b;\n    },\n    easeOutQuint: function (t, b, c, d) {\n        return c*((t=t/d-1)*t*t*t*t + 1) + b;\n    },\n    easeInOutQuint: function (t, b, c, d) {\n        if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;\n        return c/2*((t-=2)*t*t*t*t + 2) + b;\n    },\n    easeInSine: function (t, b, c, d) {\n        return -c * Math.cos(t/d * (Math.PI/2)) + c + b;\n    },\n    easeOutSine: function (t, b, c, d) {\n        return c * Math.sin(t/d * (Math.PI/2)) + b;\n    },\n    easeInOutSine: function (t, b, c, d) {\n        return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;\n    },\n    easeInExpo: function (t, b, c, d) {\n        return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n    },\n    easeOutExpo: function (t, b, c, d) {\n        return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n    },\n    easeInOutExpo: function (t, b, c, d) {\n        if (t==0) return b;\n        if (t==d) return b+c;\n        if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;\n        return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;\n    },\n    easeInCirc: function (t, b, c, d) {\n        return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;\n    },\n    easeOutCirc: function (t, b, c, d) {\n        return c * Math.sqrt(1 - (t=t/d-1)*t) + b;\n    },\n    easeInOutCirc: function (t, b, c, d) {\n        if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;\n        return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;\n    },\n    easeInElastic: function (t, b, c, d) {\n        var s=1.70158;var p=0;var a=c;\n        if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;\n        if (a < Math.abs(c)) { a=c; var s=p/4; }\n        else var s = p/(2*Math.PI) * Math.asin (c/a);\n        return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;\n    },\n    easeOutElastic: function (t, b, c, d) {\n        var s=1.70158;var p=0;var a=c;\n        if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;\n        if (a < Math.abs(c)) { a=c; var s=p/4; }\n        else var s = p/(2*Math.PI) * Math.asin (c/a);\n        return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;\n    },\n    easeInOutElastic: function (t, b, c, d) {\n        var s=1.70158;var p=0;var a=c;\n        if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);\n        if (a < Math.abs(c)) { a=c; var s=p/4; }\n        else var s = p/(2*Math.PI) * Math.asin (c/a);\n        if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;\n        return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;\n    },\n    easeInBack: function (t, b, c, d, s) {\n        if (s == undefined) s = 1.70158;\n        return c*(t/=d)*t*((s+1)*t - s) + b;\n    },\n    easeOutBack: function (t, b, c, d, s) {\n        if (s == undefined) s = 1.70158;\n        return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;\n    },\n    easeInOutBack: function (t, b, c, d, s) {\n        if (s == undefined) s = 1.70158;\n        if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;\n        return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;\n    },\n    easeInBounce: function (t, b, c, d) {\n        return c - window.fp_easings.easeOutBounce (d-t, 0, c, d) + b;\n    },\n    easeOutBounce: function (t, b, c, d) {\n        if ((t/=d) < (1/2.75)) {\n            return c*(7.5625*t*t) + b;\n        } else if (t < (2/2.75)) {\n            return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;\n        } else if (t < (2.5/2.75)) {\n            return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;\n        } else {\n            return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;\n        }\n    },\n    easeInOutBounce: function (t, b, c, d) {\n        if (t < d/2) return window.fp_easings.easeInBounce (t*2, 0, c, d) * .5 + b;\n        return window.fp_easings.easeOutBounce (t*2-d, 0, c, d) * .5 + c*.5 + b;\n    }\n};\n"
  }
]